使用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下创建子菜单及菜单项的例子相关推荐

  1. 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 标签闭包下创建子标签 | 使用 MarkupBuilderHelper 添加 xml 注释 )

    文章目录 一.标签闭包下创建子标签 二.使用 MarkupBuilderHelper 添加 xml 注释 三.完整代码示例 一.标签闭包下创建子标签 在上一篇博客 [Groovy]xml 序列化 ( ...

  2. android创建布局文件,android学习——Android Studio下创建menu布局文件

    一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...

  3. 如何在包下创建子包?

    1. 在eclipse中很简单,选中某个包,右键直接创建一个package就ok, 但是在intellj idea中则不行, 老是以点的形式, 今天终于搞掂了! 如下: 我想建立如下图片中的结构 但是 ...

  4. 如何在IDEA的包下创建子包

    1, 2, 3,

  5. javaFX学习之 菜单(Menu)

    菜单(Menu)和菜单栏(MenuBar),添加菜单项(MenuItem),将菜单分组,创建子菜单(Submenu),以及设置上下文菜单(ContextMenu) 其中ContextMenu组件是为了 ...

  6. javaFX学习之剪贴板Clipboard类型对象及剪贴板内容ClipboardContent对象 和 ContextMenu内嵌式上下文菜单的使用

    添加上下文菜单ContextMenu 当你无法分配任何UI空间给一个需要的功能时,你可以使用上下文菜单ContextMenu.上下文菜单ContextMenu是一个弹出窗口,会由一次鼠标点击事件触发显 ...

  7. java 新建菜单选项_请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxM..._考试资料网...

    请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxMenultem(复选框),一条分割线和一个Exit项.要求打开或关闭复选框时,确定是哪个被切换,是开还是关,并输出它的状态: ...

  8. 不使用输入框如何实现下拉_如何利用Axure实现下拉子菜单?

    Axure RP是一款专业的快速原型设计工具,让我们能够快速设计并创建出应用软件或Web页面的具备高保真和交互能力的原型.通过原型设计,不但能更好地与客户进行交流确认,也能明确地给开发人员以成品效果作 ...

  9. AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单

    AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单 TsFrameBar控件是创建一个下拉菜单的工具块.     TsFrameBar控件本身,可以通过创建TITEMS,自 ...

最新文章

  1. python2x NameError: name ‘abc‘ is not defined
  2. linux常用的命令行
  3. CodeForces - 1369E DeadLee(贪心+拓扑)
  4. 51单片机按键控制数码管0~9_7种常见的51单片机时钟电路图
  5. Linux下抓包工具tcpdump以及分析包的工具wireshark
  6. 自定义对话框(jDialog)
  7. php单击显示对应内容,关于php:如何单击此“提交”按钮,并使其显示原始查询中的数据,而不是清除它并进入空白页?...
  8. IntelliJ Idea学习笔记006---Idea左侧栏不显示目录结构
  9. 开源作者痛斥京东重量级项目抄袭
  10. 中国小伙CVPR 18论文遭质疑:同行难复现,要求评议组撤稿
  11. MySQL一个语句查出各种整形占用字节数及最大最小值
  12. 我可以编写一个CSS选择器来选择不具有某个类或属性的元素吗?
  13. 西安后宰门小学_【云端论坛】走向未来的墙中老校 ——后宰门小学“名校+”教育集团云论坛精彩绽放...
  14. 《CLR via C# 》第三版 英文原版电子书下载
  15. java 路径规划_应用内路径规划的简单实现
  16. 使用XTU降低CPU功耗,自动执行不失效
  17. 求大于某一正整数的最小质数
  18. 全球三大计算机病毒爆发事件,全球爆发勒索病毒 十大恐怖电脑病毒排行榜(3)...
  19. java实现微信的逆向分析_PC 端微信逆向分析
  20. 使用latex导出IEEE文献格式

热门文章

  1. python统计套利
  2. C#与.NET程序员面试宝典 2.1.6 面试题6:C#中的托管代码是什么
  3. 现在完成时与其他时态的区别
  4. Linux下对MySQL数据库的操作
  5. HTML入门二(列表,表格与表单)
  6. 【每日新闻】新“实体名单”剑指中国超算 美国动机不简单
  7. 【入木三分】的意思和解释
  8. Linux字符界面与图形界面的切换
  9. linux mysql 邮件_linux 下 搭建邮件邮件服务器(Postfix+Dovecot)(二)-基于mysql的虚拟账户登陆收发邮件...
  10. 互联网大脑的情绪,智商和梦境-互联网神经学系列第四篇