Java - JavaFx 菜单栏

1. MenuBar,Menu,MenuItem 菜单的使用

在这里插入图片描述
红色的是MenuBar,黄色的是Menue,蓝色的是MenuItem。

package top.onefine.demo.javafx;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

import java.net.URL;
import java.util.Objects;

public class Demo extends Application {
     
    public static void main(String[] args) {
     
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
     
        AnchorPane anchorPane = new AnchorPane();
        anchorPane.setStyle("-fx-background-color: #FFFF00");

        MenuBar menuBar = new MenuBar();
        Menu menu1 = new Menu("menu1");
        Menu menu2 = new Menu("menu2");
        Menu menu3 = new Menu("menu3");
        menuBar.getMenus().addAll(menu1, menu2, menu3);

        MenuItem item1 = new MenuItem("item1");
        MenuItem item2 = new MenuItem("item2");
//                , new ImageView(Objects.requireNonNull(
//                        getClass().getClassLoader().getResource("icons/help.png")).toExternalForm()
//                )
//        );  // 带图标的菜单项
        // 另一种方式
        URL img_url = getClass().getClassLoader().getResource("icons/help.png");
        assert img_url != null;
        Image img = new Image(img_url.toExternalForm(), 30, 30, true, false, true);
        ImageView imageView = new ImageView(img);
        item2.setGraphic(imageView);

        MenuItem item3 = new MenuItem("item3");

        menu1.getItems().addAll(item1, item2, item3);

        // 菜单项指定快捷键的一种方式
        item1.setAccelerator(KeyCombination.valueOf("ctrl + i"));  // CTRL + I

        // 对菜单监听——显示时,隐藏时同理
//        menu1.setOnShowing(new EventHandler() {
     
//            @Override
//            public void handle(Event event) {
     
//                System.out.println("显示过程中...");
//            }
//        });

        // 对菜单监听——显示完成后,隐藏完成后同理
//        menu1.setOnShown(new EventHandler() {
     
//            @Override
//            public void handle(Event event) {
     
//                System.out.println("显示完成!");
//            }
//        });

        // 对菜单项监听——单击事件
        item1.setOnAction(new EventHandler<ActionEvent>() {
     
            @Override
            public void handle(ActionEvent event) {
     
                System.out.println("被点击了");
            }
        });



        anchorPane.getChildren().add(menuBar);
        Scene scene = new Scene(anchorPane);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Demo");
        primaryStage.setWidth(1600);
        primaryStage.setHeight(900);
        primaryStage.show();

        // 设置菜单条长度
        menuBar.setPrefWidth(primaryStage.getWidth());
        // 宽度监听设置菜单条长度
        anchorPane.widthProperty().addListener(new ChangeListener<Number>() {
     
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
     
                menuBar.setPrefWidth(newValue.doubleValue());
            }
        });

    }
}

2. 菜单栏多选,单选,分隔符,子菜单

package top.onefine.demo.javafx;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

import java.net.URL;
import java.util.Objects;

public class Demo extends Application {
     
    public static void main(String[] args) {
     
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
     
        AnchorPane anchorPane = new AnchorPane();
        anchorPane.setStyle("-fx-background-color: #FFFF00");

        MenuBar menuBar = new MenuBar();
        Menu menu1 = new Menu("menu1");
        Menu menu2 = new Menu("menu2");
        Menu menu3 = new Menu("menu3");
        menuBar.getMenus().addAll(menu1, menu2, menu3);

        MenuItem item1 = new MenuItem("item1");
        MenuItem item2 = new MenuItem("item2");

        MenuItem item3 = new MenuItem("item3");

        // 分割符(一条线)
        SeparatorMenuItem separatorMenuItem = new SeparatorMenuItem();

        // 子菜单
        Menu menu4 = new Menu("menu4");
        MenuItem item5 = new MenuItem("MenuItem5");
        MenuItem item6 = new MenuItem("MenuItem6");
        menu4.getItems().addAll(item5, item6);

        menu1.getItems().addAll(item1, item2, separatorMenuItem, menu4, item3);

//        menu3.setDisable(true);  // 设置禁用
//        item2.setDisable(true);

//        item2.setVisible(false);  // 设置不可见

        // 菜单栏单选
        ToggleGroup tg = new ToggleGroup();  // 组
        RadioMenuItem radioMenuItem1 = new RadioMenuItem("RadioMenuItem1");
        RadioMenuItem radioMenuItem2 = new RadioMenuItem("RadioMenuItem2");
        RadioMenuItem radioMenuItem3 = new RadioMenuItem("RadioMenuItem3");
        radioMenuItem1.setToggleGroup(tg);
        radioMenuItem2.setToggleGroup(tg);
        radioMenuItem3.setToggleGroup(tg);
        menu2.getItems().addAll(radioMenuItem1, radioMenuItem2, radioMenuItem3);

        radioMenuItem3.setSelected(true);  // 设置默认为选中状态

        // 绑定单击事件
        radioMenuItem1.setOnAction(new EventHandler<ActionEvent>() {
     
            @Override
            public void handle(ActionEvent event) {
     
                RadioMenuItem source = (RadioMenuItem) event.getSource();// 获得事件源
                System.out.println(source.isSelected());  // 判断是否被选中
                // 或者直接点
                System.out.println(radioMenuItem1.isSelected());

            }
        });
        
        // 菜单栏多选
        CheckMenuItem checkMenuItem1 = new CheckMenuItem("checkMenuItem1");
        CheckMenuItem checkMenuItem2 = new CheckMenuItem("checkMenuItem2");
        CheckMenuItem checkMenuItem3 = new CheckMenuItem("checkMenuItem3");
        menu3.getItems().addAll(checkMenuItem1, checkMenuItem2, checkMenuItem3);

        checkMenuItem2.setSelected(true);  // 设置默认选中
        checkMenuItem3.setSelected(true);

        // 绑定单击事件
        checkMenuItem1.setOnAction(new EventHandler<ActionEvent>() {
     
            @Override
            public void handle(ActionEvent event) {
     
                CheckMenuItem source = (CheckMenuItem) event.getSource();// 获得事件源
                System.out.println(source.isSelected());  // 判断是否被选中
                // 或者直接点
                System.out.println(checkMenuItem1.isSelected());
            }
        });

        anchorPane.getChildren().add(menuBar);
        Scene scene = new Scene(anchorPane);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Demo");
        primaryStage.setWidth(1600);
        primaryStage.setHeight(900);
        primaryStage.show();

        // 设置菜单条长度
        menuBar.setPrefWidth(primaryStage.getWidth());
        // 宽度监听设置菜单条长度
        anchorPane.widthProperty().addListener(new ChangeListener<Number>() {
     
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
     
                menuBar.setPrefWidth(newValue.doubleValue());
            }
        });

    }
}

3. CustomMenuItem,MenuButton,SplitMenuButton,ContextMenu

更新中:https://www.bilibili.com/video/BV1rt411f7bf

你可能感兴趣的:(#,Java,javafx,gui,menu)