如何在 JavaFX 中向 ContextMenu 添加动作监听器?
javafxobject oriented programmingprogramming更新于 2026/1/9 15:08:17
上下文菜单是在与应用程序中的 UI 元素交互时出现的弹出菜单。您可以通过实例化 javafx.scene.control.ContextMenu 类来创建上下文菜单。
就像菜单一样,创建上下文菜单后,您需要向其中添加 MenuItems。您可以使用 setContextMenu() 方法将 ContextMenu 设置为 javafx.scene.control 类的任何对象。
通常,这些内容菜单会在您"右键单击"时出现。在附加控件上。
向 ContextMenu 添加操作侦听器
ContextMenu 类从 javafx.scene.control.ButtonBase 类继承了一个名为 onAction 的属性,该属性属于 ObjectProperty<EventHandler<ActionEvent>> 类型。此属性表示按下按钮时调用的操作。您可以使用 setOnAction() 方法将值设置为此属性。
要在上下文菜单上设置操作,您需要 −
实例化 ContextMenu 类。
创建一个 MenuItem 对象并将其添加到菜单。
调用菜单项对象的 setOnAction() 方法。
对于 setOnAction() 方法,您需要传递一个 EventHandler<ActionEvent> 对象,该对象包装了要在其中执行的操作的代码。
示例
以下 JavaFX 示例包含一个按钮和一个可调整按钮大小的滑块。在"右键单击"时,按钮显示两个选项 −防止调整大小和允许调整大小。
如果选择防止调整大小选项,按钮将设置为默认大小,并且您无法进一步调整其大小。如果再次选择允许调整大小,则可以调整其大小。
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.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ContextMenu_Action extends Application {
public void start(Stage stage) {
//创建一个按钮
Button button = new Button("Hello");
button.setPrefSize(60, 60);
//创建一个滑块来调整按钮大小
Slider slider = new Slider(40, 200, 60);
//将其方向设置为水平
slider.setPrefHeight(180);
slider.setOrientation(Orientation.VERTICAL);
slider.setShowTickLabels(true);
slider.setShowTickMarks(true);
slider.setMajorTickUnit(40);
slider.setBlockIncrement(20);
slider.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){
button.setPrefSize((double)newValue, (double)newValue);
}
});
//创建上下文菜单
ContextMenu contextMenu = new ContextMenu();
//为上下文菜单创建菜单项
MenuItem item1 = new MenuItem("Prevent Resizing");
MenuItem item2 = new MenuItem("Allow Resizing");
contextMenu.getItems().addAll(item1, item2);
//将 ContextMenuItem 设置为按钮
button.setContextMenu(contextMenu);
//将操作设置为上下文菜单项
item1.setOnAction((ActionEvent e) -> {
按钮.setMinWidth(60);
按钮.setPrefWidth(60);
按钮.setMaxWidth(60);
按钮.setMinHeight(60);
按钮.setMaxHeight(60);
按钮.setPrefHeight(60);
});
item2.setOnAction((ActionEvent e) -> {
button.setPrefHeight(60);
button.setPrefWidth(60);
button.setMinWidth(Button.USE_PREF_SIZE);
button.setMaxWidth(Button.USE_PREF_SIZE);
button.setMinHeight(Button.USE_PREF_SIZE);
button.setMaxHeight(Button.USE_PREF_SIZE);
});
//创建窗格
BorderPane pane = new BorderPane();
pane.setCenter(button);
pane.setLeft(new VBox(new Label("Button Reize"), slider));
pane.setPadding(new Insets(10, 10, 10, 10));
//准备场景
Scene scene = new Scene(pane, 595, 250);
stage.setTitle("Context Menu");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
输出


