javaFX学习之 在Menu菜单中 使用CheckMenuItem类来创建开关选项

本文档展示了如何使用JavaFX实现一个带有动态切换内容的菜单系统,包括CheckMenuItem、MenuBar和多个菜单选项,如标题、图片展示和内容管理。通过事件监听,用户可以实时切换页面内容和菜单选中状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
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;

import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;

public class CheckMenuItemTest 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", 20));//设置标签字体
        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 menuView = new Menu("菜单三");//创建菜单对象菜单三
        //在start方法中创建四个Check Menu Item
        CheckMenuItem titleView = createMenuItem("标题区域", name);
        CheckMenuItem binNameView = createMenuItem("名称区域", binName);
        CheckMenuItem picView = createMenuItem("图片区域", pic);
        CheckMenuItem descriptionView = createMenuItem("描述区域", description);
        menuView.getItems().addAll(titleView, binNameView, picView, descriptionView);//Menu菜单三中添加相关CheckMenuItem类型菜单选项

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

    //createMenuItem方法
    private static CheckMenuItem createMenuItem(String title, final Node node) {
        CheckMenuItem cmi = new CheckMenuItem(title);//创建一个CheckMenuItem类型菜单选项
        cmi.setSelected(true);//设置这个CheckMenuItem类型菜单选项被选中了
        cmi.selectedProperty().addListener(//给CheckMenuItem类型菜单选项添加更新选中事件匿名事件处理监听器对象
                (ObservableValue<? extends Boolean> ov, Boolean old_val,
                 Boolean new_val) -> {//事件监听回调函数体
                    node.setVisible(new_val);//设置传进来的node节点对象的可见性为本CheckMenuItem类型菜单选项的选中状态值决定
                });
        return cmi;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值