如何在JavaFX中将操作侦听器添加到ContextMenu?

上下文菜单是在与应用程序中的UI元素交互时出现的弹出菜单。您可以通过实例化javafx.scene.control.ContextMenu类来创建上下文菜单。

就像菜单一样,在创建上下文菜单之后,需要向其添加MenuItems。您可以使用setContextMenu()方法将ContextMenu设置为javafx.scene.control类的任何对象。

通常,当您在所附控件上“右键单击”时,会出现这些内容菜单。

将动作侦听器添加到ContextMenu

文本菜单类继承的命名属性的OnAction从javafx.scene.control.ButtonBase类,这是该类型OBJECTPROPERTY <事件处理<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) -> {
         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);
      });
      //创建窗格
      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);
   }
}

输出结果