MenuBar
を作成していますが、「ファイル」のようにMenu
を押してから、アクションを実行する機能は必要ありません。他のfxmlを開く、または出力が書き込まれる例など。
「ファイル」のようなMenuItem
内のMenu
(「About」にある)の機能が必要です。
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);
}
}
AFAIK、A Menu
は、サブメニューまたはMenuitem
sが追加されていない場合、クリック、表示、非表示のいずれでもイベントを発生させません。ただし、回避策は、このグラフィックノードがマウスクリックを処理する場所にグラフィックを設定することです。
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.setStyle
上記の行。しかし、これはCSS
スタイルで遊ぶことで解決できると思います。
コードの一部は ステージを使用してダイアログを作成 から取得されます。 FXML
を使用して、myDialog
ファイルをFXMLLoader
ステージにロードすることもできます。ネット上にはたくさんの例があります。
最近私は同じ問題を抱えていました、これは私がしたことです
@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()
);
}
友人からの回答と組み合わせて @ Dota2 、Menu
がない場合でもMenuItem
のonAction(Menu menu)
イベントをトリガーするヘルパークラスを作成しました] _内部。静的ヘルパーメソッドは次のとおりです。
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);
そして準備ができました!これがお役に立てば幸いです。
最近私は同じ問題に直面しました、これは私の方法でした:
メニューにmenuItemがあり、menuItemがクリックされたかのように動作します(この場合はFile
menu)。だからあなたができることはmenuItemDummy_menuItem
を持つことです
final Menu fileMenu = new Menu("File");
fileMenu.getItems().add(new MenuItem("Dummy_menuItem"));
menuBar.getMenus().add(fileMenu);
次に、File
メニューをクリックして、Dummy_menuItem
menuItemまたは必要な機能を起動します。このプロパティが必要なメニューを特定するために、numberOfMenuItems
を使用して、メニューバーのメニューにあるmenuItemの数を取得しました。
if (numberOfMenuItems == 1) {
menu.showingProperty().addListener(
(observableValue, oldValue, newValue) -> {
if (newValue) {
// the first menuItem is triggered
menu.getItems().get(0).fire();
}
}
);
}
その結果、File
メニューまたは1つのmenuItemを持つメニューをクリックすると、コンテキストがmenuItemを表示せずにDummy_menuItem
がトリガーされます。そのため、File
メニューをクリックして、別のページなどにリダイレクトされたように見えます。
お役に立てれば!!