如何在 JavaFX 中为 ContextMenu 添加动作监听器?
上下文菜单是一个弹出菜单,它出现在与应用程序中 UI 元素交互时。您可以通过实例化 **javafx.scene.control.ContextMenu** 类来创建上下文菜单。
就像菜单一样,创建上下文菜单后,需要向其中添加菜单项。您可以使用 **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) { //Creating a button Button button = new Button("Hello"); button.setPrefSize(60, 60); //Creating a slider to resize the button Slider slider = new Slider(40, 200, 60); //Setting its orientation to Horizontal 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); } }); //Creating a context menu ContextMenu contextMenu = new ContextMenu(); //Creating the menu Items for the context menu MenuItem item1 = new MenuItem("Prevent Resizing"); MenuItem item2 = new MenuItem("Allow Resizing"); contextMenu.getItems().addAll(item1, item2); //Setting the ContextMenuItem to the button button.setContextMenu(contextMenu); //Setting action to the context menu item item1.setOnAction((ActionEvent e) -> { button.setMinWidth(60); button.setPrefWidth(60); button.setMaxWidth(60); button.setMinHeight(60); button.setMaxHeight(60); button.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); }); //Creating the pane BorderPane pane = new BorderPane(); pane.setCenter(button); pane.setLeft(new VBox(new Label("Button Reize"), slider)); pane.setPadding(new Insets(10, 10, 10, 10)); //Preparing the scene Scene scene = new Scene(pane, 595, 250); stage.setTitle("Context Menu"); stage.setScene(scene); stage.show(); } public static void main(String args[]){ launch(args); } }
输出
广告