javaFX学习之Menu下创建子菜单及菜单项的例子
使用RadioMenuItem来创建子菜单的菜单项。将RadioMenuItem类型菜单项添加到ToggleGroup(互斥切换组)类型对象中,使各个RadioMenuItem类型菜单项的选中是相互排斥的效果
本例子实现:
通过setUserData()为每个RadioMenuItem定义了一个视觉特效。当ToggleGroup中的菜单项被选中时,对应的特效就会被应用在图片上。当NoEffects菜单项被选中时,setEffect()方法被赋值为null,没有特效应用在图片上
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.effect.DropShadow; import javafx.scene.effect.Effect; import javafx.scene.effect.Glow; import javafx.scene.effect.SepiaTone; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.VBox; import javafx.stage.Stage;import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry;public class MenuSample extends Application {final PageData[] pages = new PageData[]{new PageData("标题一","描述一","名称一"),new PageData("标题二","描述二","名称二"),new PageData("标题三","描述三","名称三"),new PageData("标题","描述","名称")};final String[] viewOptions = new String[]{"标题","二项式","图片","描述"};final Entry<String, Effect>[] effects = new Entry[]{//Entry类型数组对象的初始化new SimpleEntry<>("褐色特效", new SepiaTone()),//创建一个深褐色特效 用SimpleEntry类型对象保存,key是String 而value 是特效对象new SimpleEntry<>("发光特效", new Glow()),//创建一个发光特效,用SimpleEntry类型对象保存,key是String 而value 是特效对象new SimpleEntry<>("阴影特效", new DropShadow())//创建一个阴影特效,用SimpleEntry类型对象保存,key是String 而value 是特效对象};final ImageView pic = new ImageView();//创建视图显示区域final Label name = new Label();//创建标签对象final Label binName = new Label();//创建标签对象final Label description = new Label();//创建标签对象private int currentIndex = -1;//当前下标值的初始化设置public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage stage) {stage.setTitle("Menu例子");Scene scene = new Scene(new VBox(), 400, 350);//创建一个场景对象,并将场景上挂载一个垂直盒子Vbox布局对象final VBox vbox = new VBox();//创建一个垂直布局对象vbox.setAlignment(Pos.CENTER);//设置vbox对象对齐方式vbox.setSpacing(10);//设置vbox对象布局的元素之间的空间距离vbox.setPadding(new Insets(0, 10, 0, 10));//设置Vbox对象内边距vbox.getChildren().addAll(name, binName, pic, description);//vbox布局器中要添加的被布局元素对象(用vbox对象布局相关Node类型Label标签型对象和ImageView类型对象)shuffle();//清晰复原程序MenuBar menuBar = new MenuBar();//创建一个MenuBar类型对象// --- Menu FileMenu menuFile = new Menu("Menu选择图片");// --- Menu EditMenu menuEdit = new Menu("Menu图片编辑");// --- Menu ViewMenu menuView = new Menu("Menu菜单三");//将上文创建的三个Menu对象添加(镶嵌)到MenuBar对象上去menuBar.getMenus().addAll(menuFile, menuEdit, menuView);//Menu类型对象都是要镶嵌在MenuBar对象上的 Menu menuEffect = new Menu("图片特效");//创建一个菜单(后续作为子菜单)final ToggleGroup groupEffect = new ToggleGroup();//创建一个互斥切换组对象for (Entry<String, Effect> effect : effects) {//遍历保存了图形特效的List<SimpleEntry>类型对象RadioMenuItem itemEffect = new RadioMenuItem(effect.getKey());//创建一个RadioMenuItem类型菜单选项对象itemEffect.setUserData(effect.getValue());//将从SimpleEntry类型对象中获取的vlaue值(Effect类型图像特效对象)作为用户选择数据项内容设置给RadioMenuItem类型对象的用户选择数据内容itemEffect.setToggleGroup(groupEffect);//将RadioMenuItem类型对象添加到一个互斥组对象中去menuEffect.getItems().add(itemEffect);//将RadioMenuItem类型对象作为选项挂载到前文定义的 图片特效子菜单中} //No Effects菜单final MenuItem noEffects = new MenuItem("无特效");//创建一个普通菜单选项MenuItem类型对象noEffects.setOnAction((ActionEvent t) -> {//给上文定义的菜单选项对象添加交互事件处理回调函数pic.setEffect(null);//将ImageView类型对象pic的特效设置为nullgroupEffect.getSelectedToggle().setSelected(false);//将互斥组ToggleGroup类型对象groupEffect的被选中项的对象对应的选中状态设置为false未选状态});//处理菜单项的选中事件groupEffect.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {//ToggleGroup类型对象的互斥选项,选项选中改变交互事件处理回调函数的编写public void changed(ObservableValue<? extends Toggle> ov,Toggle old_toggle, Toggle new_toggle) {if (groupEffect.getSelectedToggle() != null) {Effect effect =(Effect) groupEffect.getSelectedToggle().getUserData();//获取切换组对象ToggleGroup 中选中的互斥选项对象对应的用户选中数据内容,本例中将选中数据内容转换成Effect类型图像特效对象pic.setEffect(effect);//给ImageView类型对象pic添加图形效果}}});//ToggleGroup类型对象的互斥选项,选项选中改变交互事件处理回调函数的编写groupEffect.selectedToggleProperty().addListener((ObservableValue<? extends Toggle> ov, Toggle old_toggle,Toggle new_toggle) -> {if (groupEffect.getSelectedToggle() != null) {//获取切换组对象ToggleGroup类型groupEffect对象 中选中的互斥选项对象对应的用户选中数据内容,本例中将选中数据内容转换成Effect类型图像特效对象Effect effect =(Effect) groupEffect.getSelectedToggle().getUserData();pic.setEffect(effect);//给ImageView类型对象pic添加图形效果对象effect}});//向Edit菜单添加菜单项menuEdit.getItems().addAll(menuEffect, noEffects);//向图像编辑主菜单添加挂载对应的子菜单和菜单选项 ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象,从场景对象scene对象上获取Vbox类型布局对象,并将前文定义的MenuBar类型对象添加到Vbox布局对象上去stage.setScene(scene);//舞台上添加场景stage.show();//舞台show}private void shuffle() {//洗牌程序(清晰复原程序)int i = currentIndex;while (i == currentIndex) {i = (int) (Math.random() * pages.length);}pic.setImage(pages[i].image);//图片视图区域价值图片name.setText(pages[i].name);//label添加文字binName.setText("(" + pages[i].binNames + ")");//label添加文字description.setText(pages[i].description);//label对象添加文字currentIndex = i;}private class PageData {//自定义的类似于pojo类型public String name;public String description;public String binNames;public Image image;public PageData(String name, String description, String binNames) {this.name = name;this.description = description;this.binNames = binNames;image = new Image(getClass().getResourceAsStream("archimedes.jpg"));//创建并加载一个图片对象}} }
————————————
适当的时机禁用与启用 无特效选项
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.effect.DropShadow; import javafx.scene.effect.Effect; import javafx.scene.effect.Glow; import javafx.scene.effect.SepiaTone; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.VBox; import javafx.stage.Stage;import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry;public class MenuSample extends Application {final PageData[] pages = new PageData[]{new PageData("标题一","描述一","名称一"),new PageData("标题二","描述二","名称二"),new PageData("标题三","描述三","名称三"),new PageData("标题","描述","名称")};final String[] viewOptions = new String[]{"标题","二项式","图片","描述"};final Entry<String, Effect>[] effects = new Entry[]{//Entry类型数组对象的初始化new SimpleEntry<>("褐色特效", new SepiaTone()),//创建一个深褐色特效 用SimpleEntry类型对象保存,key是String 而value 是特效对象new SimpleEntry<>("发光特效", new Glow()),//创建一个发光特效,用SimpleEntry类型对象保存,key是String 而value 是特效对象new SimpleEntry<>("阴影特效", new DropShadow())//创建一个阴影特效,用SimpleEntry类型对象保存,key是String 而value 是特效对象};final ImageView pic = new ImageView();//创建视图显示区域final Label name = new Label();//创建标签对象final Label binName = new Label();//创建标签对象final Label description = new Label();//创建标签对象private int currentIndex = -1;//当前下标值的初始化设置public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage stage) {stage.setTitle("Menu例子");Image image = new Image("https://www.dllg56.com/qt/img/logo-sing.png");stage.getIcons().add(image);Scene scene = new Scene(new VBox(), 400, 350);//创建一个场景对象,并将场景上挂载一个垂直盒子Vbox布局对象final VBox vbox = new VBox();//创建一个垂直布局对象vbox.setAlignment(Pos.CENTER);//设置vbox对象对齐方式vbox.setSpacing(10);//设置vbox对象布局的元素之间的空间距离vbox.setPadding(new Insets(0, 10, 0, 10));//设置Vbox对象内边距vbox.getChildren().addAll(name, binName, pic, description);//vbox布局器中要添加的被布局元素对象(用vbox对象布局相关Node类型Label标签型对象和ImageView类型对象)shuffle();//清晰复原程序MenuBar menuBar = new MenuBar();//创建一个MenuBar类型对象// --- Menu FileMenu menuFile = new Menu("Menu选择图片");// --- Menu EditMenu menuEdit = new Menu("Menu图片编辑");// --- Menu ViewMenu menuView = new Menu("Menu菜单三");//将上文创建的三个Menu对象添加(镶嵌)到MenuBar对象上去menuBar.getMenus().addAll(menuFile, menuEdit, menuView);//Menu类型对象都是要镶嵌在MenuBar对象上的Menu menuEffect = new Menu("图片特效");//创建一个菜单(后续作为子菜单)final ToggleGroup groupEffect = new ToggleGroup();//创建一个互斥切换组对象for (Entry<String, Effect> effect : effects) {//遍历保存了图形特效的List<SimpleEntry>类型对象RadioMenuItem itemEffect = new RadioMenuItem(effect.getKey());//创建一个RadioMenuItem类型菜单选项对象itemEffect.setUserData(effect.getValue());//将从SimpleEntry类型对象中获取的vlaue值(Effect类型图像特效对象)作为用户选择数据项内容设置给RadioMenuItem类型对象的用户选择数据内容itemEffect.setToggleGroup(groupEffect);//将RadioMenuItem类型对象添加到一个互斥组对象中去menuEffect.getItems().add(itemEffect);//将RadioMenuItem类型对象作为选下挂载到前文定义的 图片特效子菜单中} //No Effects菜单final MenuItem noEffects = new MenuItem("无特效");//创建一个普通菜单选项MenuItem类型对象 noEffects.setDisable(true);// 初始化无特效菜单选项是被禁用的noEffects.setOnAction((ActionEvent t) -> {//给上文定义的菜单选项对象添加交互事件处理回调函数pic.setEffect(null);//将ImageView类型对象pic的特效设置为nullgroupEffect.getSelectedToggle().setSelected(false);//将互斥组ToggleGroup类型对象groupEffect的被选中项的对象对应的选中状态设置为false未选状态noEffects.setDisable(true);//引用无特效选项});//处理菜单项的选中事件groupEffect.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {//ToggleGroup类型对象的互斥选项,选项选中改变交互事件处理回调函数的编写public void changed(ObservableValue<? extends Toggle> ov,Toggle old_toggle, Toggle new_toggle) {if (groupEffect.getSelectedToggle() != null) {Effect effect =(Effect) groupEffect.getSelectedToggle().getUserData();//获取切换组对象ToggleGroup 中选中的互斥选项对象对应的用户选中数据内容,本例中将选中数据内容转换成Effect类型图像特效对象pic.setEffect(effect);//给ImageView类型对象pic添加图形效果}}});//ToggleGroup类型对象的互斥选项,选项选中改变交互事件处理回调函数的编写groupEffect.selectedToggleProperty().addListener((ObservableValue<? extends Toggle> ov, Toggle old_toggle,Toggle new_toggle) -> {if (groupEffect.getSelectedToggle() != null) {//获取切换组对象ToggleGroup类型groupEffect对象 中选中的互斥选项对象对应的用户选中数据内容,本例中将选中数据内容转换成Effect类型图像特效对象Effect effect =(Effect) groupEffect.getSelectedToggle().getUserData();pic.setEffect(effect);//给ImageView类型对象pic添加图形效果对象effect noEffects.setDisable(false);//启用无特效选项}else { noEffects.setDisable(true);//禁用无特效选项}});//向Edit菜单添加菜单项menuEdit.getItems().addAll(menuEffect, noEffects);//向图像编辑主菜单添加挂载对应的子菜单和菜单选项((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象,从场景对象scene对象上获取Vbox类型布局对象,并将前文定义的MenuBar类型对象添加到Vbox布局对象上去stage.setScene(scene);//舞台上添加场景stage.show();//舞台show}private void shuffle() {//洗牌程序(清晰复原程序)int i = currentIndex;while (i == currentIndex) {i = (int) (Math.random() * pages.length);}pic.setImage(pages[i].image);//图片视图区域价值图片name.setText(pages[i].name);//label添加文字binName.setText("(" + pages[i].binNames + ")");//label添加文字description.setText(pages[i].description);//label对象添加文字currentIndex = i;}private class PageData {//自定义的类似于pojo类型public String name;public String description;public String binNames;public Image image;public PageData(String name, String description, String binNames) {this.name = name;this.description = description;this.binNames = binNames;image = new Image(getClass().getResourceAsStream("archimedes.jpg"));//创建并加载一个图片对象}} }
javaFX学习之Menu下创建子菜单及菜单项的例子相关推荐
- 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 标签闭包下创建子标签 | 使用 MarkupBuilderHelper 添加 xml 注释 )
文章目录 一.标签闭包下创建子标签 二.使用 MarkupBuilderHelper 添加 xml 注释 三.完整代码示例 一.标签闭包下创建子标签 在上一篇博客 [Groovy]xml 序列化 ( ...
- android创建布局文件,android学习——Android Studio下创建menu布局文件
一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...
- 如何在包下创建子包?
1. 在eclipse中很简单,选中某个包,右键直接创建一个package就ok, 但是在intellj idea中则不行, 老是以点的形式, 今天终于搞掂了! 如下: 我想建立如下图片中的结构 但是 ...
- 如何在IDEA的包下创建子包
1, 2, 3,
- javaFX学习之 菜单(Menu)
菜单(Menu)和菜单栏(MenuBar),添加菜单项(MenuItem),将菜单分组,创建子菜单(Submenu),以及设置上下文菜单(ContextMenu) 其中ContextMenu组件是为了 ...
- javaFX学习之剪贴板Clipboard类型对象及剪贴板内容ClipboardContent对象 和 ContextMenu内嵌式上下文菜单的使用
添加上下文菜单ContextMenu 当你无法分配任何UI空间给一个需要的功能时,你可以使用上下文菜单ContextMenu.上下文菜单ContextMenu是一个弹出窗口,会由一次鼠标点击事件触发显 ...
- java 新建菜单选项_请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxM..._考试资料网...
请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxMenultem(复选框),一条分割线和一个Exit项.要求打开或关闭复选框时,确定是哪个被切换,是开还是关,并输出它的状态: ...
- 不使用输入框如何实现下拉_如何利用Axure实现下拉子菜单?
Axure RP是一款专业的快速原型设计工具,让我们能够快速设计并创建出应用软件或Web页面的具备高保真和交互能力的原型.通过原型设计,不但能更好地与客户进行交流确认,也能明确地给开发人员以成品效果作 ...
- AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单
AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单 TsFrameBar控件是创建一个下拉菜单的工具块. TsFrameBar控件本身,可以通过创建TITEMS,自 ...
最新文章
- python2x NameError: name ‘abc‘ is not defined
- linux常用的命令行
- CodeForces - 1369E DeadLee(贪心+拓扑)
- 51单片机按键控制数码管0~9_7种常见的51单片机时钟电路图
- Linux下抓包工具tcpdump以及分析包的工具wireshark
- 自定义对话框(jDialog)
- php单击显示对应内容,关于php:如何单击此“提交”按钮,并使其显示原始查询中的数据,而不是清除它并进入空白页?...
- IntelliJ Idea学习笔记006---Idea左侧栏不显示目录结构
- 开源作者痛斥京东重量级项目抄袭
- 中国小伙CVPR 18论文遭质疑:同行难复现,要求评议组撤稿
- MySQL一个语句查出各种整形占用字节数及最大最小值
- 我可以编写一个CSS选择器来选择不具有某个类或属性的元素吗?
- 西安后宰门小学_【云端论坛】走向未来的墙中老校 ——后宰门小学“名校+”教育集团云论坛精彩绽放...
- 《CLR via C# 》第三版 英文原版电子书下载
- java 路径规划_应用内路径规划的简单实现
- 使用XTU降低CPU功耗,自动执行不失效
- 求大于某一正整数的最小质数
- 全球三大计算机病毒爆发事件,全球爆发勒索病毒 十大恐怖电脑病毒排行榜(3)...
- java实现微信的逆向分析_PC 端微信逆向分析
- 使用latex导出IEEE文献格式
热门文章
- python统计套利
- C#与.NET程序员面试宝典 2.1.6 面试题6:C#中的托管代码是什么
- 现在完成时与其他时态的区别
- Linux下对MySQL数据库的操作
- HTML入门二(列表,表格与表单)
- 【每日新闻】新“实体名单”剑指中国超算 美国动机不简单
- 【入木三分】的意思和解释
- Linux字符界面与图形界面的切换
- linux mysql 邮件_linux 下 搭建邮件邮件服务器(Postfix+Dovecot)(二)-基于mysql的虚拟账户登陆收发邮件...
- 互联网大脑的情绪,智商和梦境-互联网神经学系列第四篇