javaFX学习之 菜单(Menu)

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

其中ContextMenu组件是为了节省空间而设计的,它是一个弹出框式的菜单组件

你可以使用下面这些JavaFX API中的类来在你的应用程序中构建菜单

· MenuBar

· MenuItem

· Menu

————————————————————

· CheckMenuItem

· RadioMenuItem

· Menu

——————————————————

· CustomMenuItem

· SeparatorMenuItem

· ContextMenu

————————————————————

 一个包含典型菜单栏的应用程序 

包含菜单栏和三个菜单分类的应用程序 

(菜单的作用:

在JavaFX应用程序中构建菜单

一个菜单Menu是一系列根据需要进行显示的可响应事件的菜单项MenuItem所组合成的一个附合组件。当一个菜单Menu可见时,用户一次可以选择一个菜单项MenuItem。当用户点击一个菜单项MenuItem后,菜单就会回到隐藏模式。通过使用菜单,你将一些不需要始终显示的功能放在其中,这样可以节省你的应用程序UI空间

) 

当在你的JavaFX应用程序中构建菜单时,使用下面的菜单项类。

· MenuItem – 创建一个可响应事件的选项

· Menu – 创建一个子菜单

· RadioButtonItem – 创建一个相互排斥的选项

· CheckMenuItem – 创建一个可在选中和非选中状态切换的选项

 在一个分类中对菜单项进行分隔,使用SeparatorMenuItem类

菜单一般位于窗口的上方,scene中其余的空间留给那些重要的控件。基于某种原因,如果你不想在你的UI中为菜单栏分配任何可见空间,你可以使用上下文菜单,它通过用户点击鼠标打开 

创建菜单栏

尽管菜单栏可以被放置在UI的任何其他地方,但是菜单栏一般是位于UI的上方,而且它包含一个或者多个菜单。菜单栏会自动伸缩以适用应用程序窗口的宽度。默认情况下,每个添加到菜单栏的菜单是由带有文本的按钮表示的

 创建一个简单只有Menu菜单 无选项  的窗口例子

import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import javafx.application.Application;
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;

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<>("Sepia Tone", new SepiaTone()),//创建一个深褐色特效
            new SimpleEntry<>("Glow", new Glow()),//创建一个发光特效
            new SimpleEntry<>("Shadow", new DropShadow())//创建一个阴影特效
    };

    final ImageView pic = new ImageView();//创建一个图形视图展示区域对象
    final Label name = new Label();//创建一个label对象
    final Label binName = new Label();//创建一个label对象
    final Label description = new Label();//创建一个label对象

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("Menu例子");
        Scene scene = new Scene(new VBox(), 400, 350);//创建一个场景对象,并将场景上挂载一个垂直盒子Vbox布局对象

        MenuBar menuBar = new MenuBar();//创建一个MenuBar类型对象

        // --- Menu File
        Menu menuFile = new Menu("Menu菜单一");

        // --- Menu Edit
        Menu menuEdit = new Menu("Menu菜单二");

        // --- Menu View
        Menu menuView = new Menu("Menu菜单三");

       //将上文创建的三个Menu对象添加(镶嵌)到MenuBar对象上去
        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);//Menu类型对象都是要镶嵌在MenuBar对象上的


        ((VBox) scene.getRoot()).getChildren().addAll(menuBar);//从场景对象scene对象上获取Vbox类型布局对象,并将前文定义的MenuBar类型对象添加到Vbox布局对象上去

        stage.setScene(scene);//舞台上添加场景
        stage.show();//舞台show
    }


    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("folder_16.jpg"));//创建并加载一个图片对象
        }
    }
}

 与其他UI控件不一样,Menu类和其他MenuItem的扩展类不是继承自Node类。他们不能直接添加到应用程序scene中,必须通过 MenuBar(菜单栏)的 getMenus().addAll 的  方法方法添加到菜单栏MenuBar类型对象上(镶嵌到MenuBar类型组件上)时才可见

——————————————————————————————

给菜单Menu类型对象上添加(镶嵌)菜单项MenuItem类型对象

添加菜单项

import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import javafx.application.Application;
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.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

public class MenuTest 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<>("Sepia Tone", new SepiaTone()),//创建一个深褐色特效
            new SimpleEntry<>("Glow", new Glow()),//创建一个发光特效
            new SimpleEntry<>("Shadow", new DropShadow())//创建一个阴影特效
    };

    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);
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("Menu例子");
        Scene scene = new Scene(new VBox(), 400, 350);//设置场景宽度和高度
        scene.setFill(Color.DARKBLUE);//场景填充颜色

        name.setFont(new Font("Verdana Bold", 22));//设置标签字体
        binName.setFont(new Font("Arial Italic", 10));//设置标签字体
        pic.setFitHeight(150);//图片设置固定高度
        pic.setPreserveRatio(true);//图片设置保留比例
        description.setWrapText(true);//标签文字包围特效设置
        description.setTextAlignment(TextAlignment.JUSTIFY);//设置label标签的对齐方式

        shuffle();//清晰复原程序

        MenuBar menuBar = new MenuBar();//创建一个MenuBar对象,以后Menu类型对象需要镶嵌到这个MenuBar对象的上面

        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标签型对象)

        // --- Menu File
        Menu menuFile = new Menu("菜单一");
        MenuItem add = new MenuItem("重置功能",
                new ImageView(new Image("https://profile.csdnimg.cn/B/F/8/3_zy103118")));//创建一个MenuItem类型对象其背景设置为一个图片
        add.setOnAction((ActionEvent t) -> {//MenuItem类型对象添加点击事件处理程序回调函数
            shuffle();
            vbox.setVisible(true);
        });

        menuFile.getItems().addAll(add);//Menu菜单类型对象添加MenuItem类型选项对象

        // --- Menu Edit
        Menu menuEdit = new Menu("菜单二");

        // --- Menu View
        Menu menuView = new Menu("菜单三");

        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);//将上述定义的Menu对象镶嵌进MenuBar类型对象中
        ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象
        stage.setScene(scene);//舞台设置场景
        stage.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这么个domain型业务领域对象
        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("department.png"));
        }
    }
}

import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import javafx.application.Application;
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.input.KeyCombination;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

public class MenuTest 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<>("Sepia Tone", new SepiaTone()),//创建一个深褐色特效
            new SimpleEntry<>("Glow", new Glow()),//创建一个发光特效
            new SimpleEntry<>("Shadow", new DropShadow())//创建一个阴影特效
    };

    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);
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("Menu例子");
        Scene scene = new Scene(new VBox(), 400, 350);//设置场景宽度和高度
        scene.setFill(Color.DARKBLUE);//场景填充颜色

        name.setFont(new Font("Verdana Bold", 22));//设置标签字体
        binName.setFont(new Font("Arial Italic", 10));//设置标签字体
        pic.setFitHeight(150);//图片设置固定高度
        pic.setPreserveRatio(true);//图片设置保留比例
        description.setWrapText(true);//标签文字包围特效设置
        description.setTextAlignment(TextAlignment.JUSTIFY);//设置label标签的对齐方式

        shuffle();//清晰复原程序

        MenuBar menuBar = new MenuBar();//创建一个MenuBar对象,以后Menu类型对象需要镶嵌到这个MenuBar对象的上面

        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标签型对象)

        // --- Menu File
        Menu menuFile = new Menu("菜单一");
        MenuItem add = new MenuItem("重置功能",
                new ImageView(new Image("https://profile.csdnimg.cn/B/F/8/3_zy103118")));//创建一个MenuItem类型对象其背景设置为一个图片
        add.setOnAction((ActionEvent t) -> {//MenuItem类型对象添加点击事件处理程序回调函数
            shuffle();
            vbox.setVisible(true);
        });

        MenuItem clear = new MenuItem("清除内容");//创建一个MenuItem选项组件
        clear.setAccelerator(KeyCombination.keyCombination("Ctrl+E"));//Accelerator加速器引申意义为快捷方式:将名为clear的MenuItem对象的访问快捷方式设置为Ctrl+E组合键
        clear.setOnAction((ActionEvent t) -> {//设置名称为clear的MenuItem对象的交互事件处理回调函数
            vbox.setVisible(false);//设置vbox对象的可见性为Visible为false,则vbox对象就不可见了
        });


        menuFile.getItems().addAll(add);//Menu菜单类型对象添加MenuItem类型选项对象

        // --- Menu Edit
        Menu menuEdit = new Menu("菜单二");//菜单对象的建立
        menuEdit.getItems().add(clear);//给菜单二对象上添加MenuItem对象clear

        // --- Menu View
        Menu menuView = new Menu("菜单三");//创建菜单对象菜单三

        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);//将上述定义的Menu对象镶嵌进MenuBar类型对象中
        ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象
        stage.setScene(scene);//舞台设置场景
        stage.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这么个domain型业务领域对象
        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("department.png"));
        }
    }
}

MenuItem类的实现允许开发者设置一个菜单快捷键,这是一个组合键,能够执行和点击菜单项一样的动作。对于Clear菜单项,用户可以从菜单中选择动作,也可以同时按下Ctrl和E键。

Exit菜单关闭应用程序窗口。该菜单项设置System.exit(0)响应动作

创建Exit菜单项

 

 

import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import javafx.application.Application;
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.input.KeyCombination;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

public class MenuTest 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<>("Sepia Tone", new SepiaTone()),//创建一个深褐色特效
            new SimpleEntry<>("Glow", new Glow()),//创建一个发光特效
            new SimpleEntry<>("Shadow", new DropShadow())//创建一个阴影特效
    };

    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);
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("Menu例子");
        Scene scene = new Scene(new VBox(), 400, 350);//设置场景宽度和高度
        scene.setFill(Color.DARKBLUE);//场景填充颜色

        name.setFont(new Font("Verdana Bold", 22));//设置标签字体
        binName.setFont(new Font("Arial Italic", 10));//设置标签字体
        pic.setFitHeight(150);//图片设置固定高度
        pic.setPreserveRatio(true);//图片设置保留比例
        description.setWrapText(true);//标签文字包围特效设置
        description.setTextAlignment(TextAlignment.JUSTIFY);//设置label标签的对齐方式

        shuffle();//清晰复原程序

        MenuBar menuBar = new MenuBar();//创建一个MenuBar对象,以后Menu类型对象需要镶嵌到这个MenuBar对象的上面

        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标签型对象)

        // --- Menu File
        Menu menuFile = new Menu("菜单一");
        MenuItem add = new MenuItem("切换内容",
                new ImageView(new Image("https://profile.csdnimg.cn/B/F/8/3_zy103118")));//创建一个MenuItem类型对象其背景设置为一个图片
        add.setOnAction((ActionEvent t) -> {//MenuItem类型对象添加点击事件处理程序回调函数
            shuffle();
            vbox.setVisible(true);
        });

        MenuItem clear = new MenuItem("清除内容");//创建一个MenuItem选项组件
        clear.setAccelerator(KeyCombination.keyCombination("Ctrl+E"));//Accelerator加速器引申意义为快捷方式:将名为clear的MenuItem对象的访问快捷方式设置为Ctrl+E组合键
        clear.setOnAction((ActionEvent t) -> {//设置名称为clear的MenuItem对象的交互事件处理回调函数
            vbox.setVisible(false);//设置vbox对象的可见性为Visible为false,则vbox对象就不可见了
        });


        MenuItem exit = new MenuItem("Exit");
        exit.setOnAction((ActionEvent t) -> {
            System.exit(0);
        });

        menuFile.getItems().addAll(add);//Menu菜单类型对象添加MenuItem类型选项对象

        // --- Menu Edit
        Menu menuEdit = new Menu("菜单二");//菜单对象的建立
        menuEdit.getItems().add(clear);//给菜单二对象上添加MenuItem对象clear

        // --- Menu View
        Menu menuExit = new Menu("退出菜单");//创建菜单对象菜单三
        menuExit.getItems().add(exit);

        menuBar.getMenus().addAll(menuFile, menuEdit, menuExit);//将上述定义的Menu对象镶嵌进MenuBar类型对象中
        ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象
        stage.setScene(scene);//舞台设置场景
        stage.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这么个domain型业务领域对象
        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("department.png"));
        }
    }
}

————————————————————————

 你可以创建一个分隔菜单项,并通过getItems()方法将其添加进去,以将Exit菜单隔离开

添加菜单项

menuFile.getItems().addAll(add,new SeparatorMenuItem(), exit);//Menu菜单类型对象添加MenuItem类型选项对象
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import javafx.application.Application;
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.input.KeyCombination;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

public class MenuTest 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<>("Sepia Tone", new SepiaTone()),//创建一个深褐色特效
            new SimpleEntry<>("Glow", new Glow()),//创建一个发光特效
            new SimpleEntry<>("Shadow", new DropShadow())//创建一个阴影特效
    };

    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);
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("Menu例子");
        Scene scene = new Scene(new VBox(), 400, 350);//设置场景宽度和高度
        scene.setFill(Color.DARKBLUE);//场景填充颜色

        name.setFont(new Font("Verdana Bold", 22));//设置标签字体
        binName.setFont(new Font("Arial Italic", 10));//设置标签字体
        pic.setFitHeight(150);//图片设置固定高度
        pic.setPreserveRatio(true);//图片设置保留比例
        description.setWrapText(true);//标签文字包围特效设置
        description.setTextAlignment(TextAlignment.JUSTIFY);//设置label标签的对齐方式

        shuffle();//清晰复原程序

        MenuBar menuBar = new MenuBar();//创建一个MenuBar对象,以后Menu类型对象需要镶嵌到这个MenuBar对象的上面

        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标签型对象)

        // --- Menu File
        Menu menuFile = new Menu("菜单一");
        MenuItem add = new MenuItem("切换内容",
                new ImageView(new Image("https://profile.csdnimg.cn/B/F/8/3_zy103118")));//创建一个MenuItem类型对象其背景设置为一个图片
        add.setOnAction((ActionEvent t) -> {//MenuItem类型对象添加点击事件处理程序回调函数
            shuffle();
            vbox.setVisible(true);
        });

        MenuItem clear = new MenuItem("清除内容");//创建一个MenuItem选项组件
        clear.setAccelerator(KeyCombination.keyCombination("Ctrl+E"));//Accelerator加速器引申意义为快捷方式:将名为clear的MenuItem对象的访问快捷方式设置为Ctrl+E组合键
        clear.setOnAction((ActionEvent t) -> {//设置名称为clear的MenuItem对象的交互事件处理回调函数
            vbox.setVisible(false);//设置vbox对象的可见性为Visible为false,则vbox对象就不可见了
        });


        MenuItem exit = new MenuItem("Exit");
        exit.setOnAction((ActionEvent t) -> {
            System.exit(0);
        });

        menuFile.getItems().addAll(add,new SeparatorMenuItem(), exit);//Menu菜单类型对象添加MenuItem类型选项对象

        // --- Menu Edit
        Menu menuEdit = new Menu("菜单二");//菜单对象的建立
        menuEdit.getItems().add(clear);//给菜单二对象上添加MenuItem对象clear

        // --- Menu View
        Menu menuExit = new Menu("菜单三");//创建菜单对象菜单三


        menuBar.getMenus().addAll(menuFile, menuEdit, menuExit);//将上述定义的Menu对象镶嵌进MenuBar类型对象中
        ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象
        stage.setScene(scene);//舞台设置场景
        stage.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这么个domain型业务领域对象
        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("department.png"));
        }
    }
}

 

 

### 配置JavaFX应用中的Mac OS X原生菜单栏 对于在JavaFX应用程序中设置Mac系统的菜单栏,可以通过自定义`MenuBar`并将其集成到应用程序窗口来实现。然而,在macOS平台上,为了使菜单栏显示为顶部屏幕的系统级菜单栏而非应用程序窗口内部的一部分,需调用特定的方法。 #### 设置全局属性以启用原生菜单栏 通过设置系统属性`com.apple.mrj.application.growbox.insetTop`和`apple.laf.useScreenMenuBar`,可以让JavaFX应用程序适应macOS环境下的特殊需求[^2]: ```java System.setProperty("apple.laf.useScreenMenuBar", "true"); ``` 这段代码应当放置于应用程序入口处,即`main()`函数内尽早执行的位置之前,确保其效果覆盖整个程序生命周期。 #### 创建与配置菜单项 创建标准的`Menu`对象作为顶级菜单条目,并向其中添加子菜单或具体操作命令。针对macOS的特点,应该特别注意隐藏不必要的默认菜单(比如“帮助”),并且遵循苹果的人机交互指南(HIG),合理安排菜单结构[^1]。 ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.stage.Stage; public class MacNativeMenuBarExample extends Application { @Override public void start(Stage primaryStage) { System.setProperty("apple.laf.useScreenMenuBar", "true"); Menu fileMenu = new Menu("_File"); // Note the underscore before 'F' to set mnemonic key MenuItem newItem = new MenuItem("New..."); Menu editMenu = new Menu("_Edit"); MenuItem cutItem = new MenuItem("Cut"); MenuItem copyItem = new MenuItem("Copy"); MenuItem pasteItem = new MenuItem("Paste"); Menu helpMenu = new Menu("_Help"); MenuItem aboutItem = new MenuItem("About..."); MenuBar menuBar = new MenuBar(); menuBar.getMenus().addAll(fileMenu, editMenu, helpMenu); Scene scene = new Scene(menuBar); primaryStage.setScene(scene); primaryStage.show(); } } ``` 上述例子展示了如何构建基本的文件(`_File`)、编辑(`_Edit`)及帮助(`_Help`)三个主要菜单及其下拉选项。需要注意的是,在字符串前加上下划线是为了指定快捷键辅助字符;而在实际部署至生产环境中时,则应考虑国际化资源包的支持以便更好地服务于不同语言背景的用户群体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值