JavaFX菜单按钮

时间:2020-01-09 10:36:38  来源:igfitidea点击:

JavaFX MenuButton控件可以显示用户可以选择的菜单选项列表。 JavaFX MenuButton可以显示或者隐藏菜单项。菜单项通常在菜单按钮中单击一个小箭头按钮时显示。 JavaFX MenuButton控件由类javafx.scene.control.MenuButton表示。

创建一个菜单按钮

我们可以通过创建MenuButton类的实例来创建JavaFX MenuButton。这是一个JavaFXMenuButton实例化示例:

MenuItem menuItem1 = new MenuItem("Option 1");
MenuItem menuItem2 = new MenuItem("Option 2");
MenuItem menuItem3 = new MenuItem("Option 3");

MenuButton menuButton = new MenuButton("Options", null, menuItem1, menuItem2, menuItem3);

首先创建3个" MenuItem"实例,每个实例具有不同的文本。然后创建一个MenuButton实例,将按钮文本,图形图标(null)和3个MenuItem实例作为参数传递给MenuButton构造函数。

第二个" MenuButton"构造函数参数是" Node",它用作图形图标,显示在MenuButton文本旁边。我们可以使用ImageView控件在MenuButton文本旁边显示图像。只需创建一个ImageView实例,并将对该实例的引用传递给MenuButton构造函数,而不是null即可。这是一个例子:

MenuItem menuItem1 = new MenuItem("Option 1");
MenuItem menuItem2 = new MenuItem("Option 2");
MenuItem menuItem3 = new MenuItem("Option 3");

FileInputStream input = new FileInputStream("resources/images/iconmonstr-menu-5-32.png");
Image image = new Image(input);
ImageView imageView = new ImageView(image);

MenuButton menuButton = new MenuButton("Options", imageView, menuItem1, menuItem2, menuItem3);

将菜单按钮添加到场景图

要使" MenuButton"可见,必须将其添加到JavaFX场景图中。这意味着将其添加到"场景",或者作为添加到"场景"对象的布局的子级。

这是一个将JavaFXMenuButton添加到场景图的示例:

package com.Hyman.javafx.controls;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import java.io.FileInputStream;

public class MenuButtonExperiments extends Application  {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("ImageView Experiment 1");

        MenuItem menuItem1 = new MenuItem("Option 1");
        MenuItem menuItem2 = new MenuItem("Option 2");
        MenuItem menuItem3 = new MenuItem("Option 3");

        MenuButton menuButton = new MenuButton("Options", null, menuItem1, menuItem2, menuItem3);

        HBox hbox = new HBox(menuButton);

        Scene scene = new Scene(hbox, 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

这是上述示例生成的应用程序的外观:

这是将相同的示例添加到MenuButton中的图形图标后的样子:

package com.Hyman.javafx.controls;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import java.io.FileInputStream;

public class MenuButtonExperiments extends Application  {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("ImageView Experiment 1");

        MenuItem menuItem1 = new MenuItem("Option 1");
        MenuItem menuItem2 = new MenuItem("Option 2");
        MenuItem menuItem3 = new MenuItem("Option 3");

        FileInputStream input = new FileInputStream("resources/images/iconmonstr-menu-5-32.png");
        Image image = new Image(input);
        ImageView imageView = new ImageView(image);

        MenuButton menuButton = new MenuButton("Options", imageView, menuItem1, menuItem2, menuItem3);

        HBox hbox = new HBox(menuButton);

        Scene scene = new Scene(hbox, 200, 160);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

这是上述示例生成的应用程序的外观:

响应菜单项选择

要在用户选择菜单项时做出响应,请将" on action"事件侦听器添加到相应的" MenuItem"对象。这是一个示例,向我们展示如何将动作事件侦听器添加到MenuItem对象:

MenuItem menuItem3 = new MenuItem("Option 3");

menuItem3.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println("Option 3 selected");
    }
});

我们也可以使用Java Lambda表达式代替EventHandler接口的匿名实现。看起来是这样的:

menuItem3.setOnAction(event -> {
    System.out.println("Option 3 selected via Lambda");
});