14

私はを作成していますが、 「ファイル」MenuBarのようなものを押してからアクションを実行する機能は必要ありません。Menu他のfxmlを開く、または出力が書き込まれる例など。

「ファイル」MenuItemのような(「アバウト」) の機能が欲しい。Menu

package model;

import static java.lang.System.out;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 * Example of creating menus in JavaFX.
 * 
 * @author Dustin
 */
public class JavaFxMenus extends Application
{
   /**
    * Build menu bar with included menus for this demonstration.
    * 
    * @param menuWidthProperty Width to be bound to menu bar width.
    * @return Menu Bar with menus included.
    */
   private MenuBar buildMenuBarWithMenus(final ReadOnlyDoubleProperty menuWidthProperty)
   {
      final MenuBar menuBar = new MenuBar();

      // Prepare left-most 'File' drop-down menu
      final Menu fileMenu = new Menu("File");

      menuBar.getMenus().add(fileMenu);
      //menuBar.getOnMouseClicked().handle(this);


      // Prepare 'Examples' drop-down menu
      final Menu examplesMenu = new Menu("JavaFX 2.0 Examples");
      examplesMenu.getItems().add(new MenuItem("Text Example"));
      examplesMenu.getItems().add(new MenuItem("Objects Example"));
      examplesMenu.getItems().add(new MenuItem("Animation Example"));
      menuBar.getMenus().add(examplesMenu);

      // Prepare 'Help' drop-down menu
      final Menu helpMenu = new Menu("Help");
      helpMenu.setOnAction(null);

      final MenuItem searchMenuItem = new MenuItem("Search");
      searchMenuItem.setDisable(true);
      helpMenu.getItems().add(searchMenuItem);
      final MenuItem onlineManualMenuItem = new MenuItem("Online Manual");
      onlineManualMenuItem.setVisible(false);
      helpMenu.getItems().add(onlineManualMenuItem);
      helpMenu.getItems().add(new SeparatorMenuItem());
      final MenuItem aboutMenuItem =
         MenuItemBuilder.create()
                        .text("About")
                        .onAction(
                            new EventHandler<ActionEvent>()
                            {
                               @Override public void handle(ActionEvent e)
                               {
                                  out.println("You clicked on About!");
                               }
                            })
                        .accelerator(
                            new KeyCodeCombination(
                               KeyCode.A, KeyCombination.CONTROL_DOWN))
                        .build();             
      helpMenu.getItems().add(aboutMenuItem);
      menuBar.getMenus().add(helpMenu);

      // bind width of menu bar to width of associated stage
      menuBar.prefWidthProperty().bind(menuWidthProperty);

      return menuBar;
   }

   /**
    * Start of JavaFX application demonstrating menu support.
    * 
    * @param stage Primary stage.
    */
   @Override
   public void start(final Stage stage)
   {
      stage.setTitle("Creating Menus with JavaFX 2.0");
      final Group rootGroup = new Group();
      final Scene scene = new Scene(rootGroup, 800, 400, Color.WHEAT);



      final MenuBar menuBar = buildMenuBarWithMenus(stage.widthProperty());
      rootGroup.getChildren().add(menuBar);
      stage.setScene(scene);
      stage.show();
   }

   /**
    * Main executable function for running examples.
    * 
    * @param arguments Command-line arguments: none expected.
    */
   public static void main(final String[] arguments)
   {
      Application.launch(arguments);
   }
}
4

5 に答える 5

19

AFAIK、AMenuは、サブメニューまたはMenuitemsが追加されていない場合、クリック、表示、非表示のいずれでもイベントを発生させません。ただし、回避策は、このグラフィックノードがマウスクリックを処理する場所にグラフィックを設定することです。たとえば、

Label menuLabel = new Label("File");
menuLabel.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {

        Stage myDialog = new Stage();
        myDialog.initModality(Modality.WINDOW_MODAL);

        Scene myDialogScene = new Scene(VBoxBuilder.create()
            .children(new Text("Hello! it's My Dialog."))
            .alignment(Pos.CENTER)
            .padding(new Insets(10))
            .build());

        myDialog.setScene(myDialogScene);
        myDialog.show();
    }
});
Menu fileMenuButton = new Menu();
fileMenuButton.setGraphic(menuLabel);
menuBar.getMenus().add(fileMenuButton);

このアプローチの欠点は、ラベルがメニューのすべてのスペースをカバーしていないため、メニューの端をクリックしてもマウスイベントがトリガーされないことです。上記のコメントを外してこれを参照してくださいmenuLabel.setStyleCSSしかし、これは私が思うスタイルで遊ぶことによって解決することができます。
コードは、Stageを使用してCreateDialogから部分的に取得されます。FXMLを使用して、ファイルをmyDialogステージにロードすることもできますFXMLLoader。ネット上にはたくさんの例があります。

于 2012-04-25T13:58:13.920 に答える
4

最近私は同じ問題を抱えていました、これは私がしたことです

@FXML private Menu myMenu;

@Override
public void initialize(URL url, ResourceBundle rb) {

    myMenu.setGraphic(
        ButtonBuilder.create()
            .text("btnText")
            .onAction(new EventHandler<ActionEvent>(){
                @Override public void handle(ActionEvent t) {
                    //TODO
             } })
            .build()
    );
}
于 2013-09-25T13:43:06.737 に答える
3

友人の@Dota2Menuからの回答と組み合わせて、内部onAction(Menu menu)にイベントがない場合でもイベントをトリガーするヘルパークラスを作成しましたMenuItem。静的ヘルパーメソッドは次のとおりです。

public static void onAction(Menu menu)
{
    final MenuItem menuItem = new MenuItem();

    menu.getItems().add(menuItem);
    menu.addEventHandler(Menu.ON_SHOWN, event -> menu.hide());
    menu.addEventHandler(Menu.ON_SHOWING, event -> menu.fire());
}

次に、電話します。

YourHelperClass.onAction(myMenu);

そして準備ができました!これがお役に立てば幸いです。

于 2017-01-23T19:05:40.800 に答える
1

最近私は同じ問題に直面しました、これは私の方法でした:

メニューにmenuItemがあり、menuItemがクリックされたかのように動作します(この場合はFilemenu)。だからあなたができることはmenuItemを持つことですDummy_menuItem

final Menu fileMenu = new Menu("File");
fileMenu.getItems().add(new MenuItem("Dummy_menuItem"));
menuBar.getMenus().add(fileMenu);

File次に、メニューをクリックして、 Dummy_menuItemmenuItemまたは必要な機能を起動します。このプロパティが必要なメニューを特定するためnumberOfMenuItemsに、メニューバーのメニューにあるmenuItemの数を取得していました。

if (numberOfMenuItems == 1) {
    menu.showingProperty().addListener(
        (observableValue, oldValue, newValue) -> {
            if (newValue) {
                // the first menuItem is triggered
                menu.getItems().get(0).fire();
            }
        }
    );
}

結果は、メニューDummy_menuItemのクリック時にmenuItemを表示するコンテキスト、Fileまたは1つのmenuItemを持つメニューなしでトリガーされることです。Fileそのため、メニューをクリックして別のページなどにリダイレクトされたように見えます。

お役に立てれば!!

于 2016-07-22T11:57:27.960 に答える
-4

メインメニューラベルでのアクションは許可できないと思います。

ただし、スタックペインを作成して、テキストとメニューバーで埋めることはできます。

于 2012-09-12T06:51:06.433 に答える