如何在 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);
   }
}

輸出

更新於: 2020年5月20日

683 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告