メニューに関連するいくつかのJavaFXクラスを見てきましたが、私が欲しいものを見つけることができませんでした。 MenuBar
のように動作するものを実装したいと思いますが、クリック時ではなく、ホバー上でメニューを開くことが必要な場合を除きます。私は自分自身で一から何かを構築することはできますが、それと似たようなことができるものがあれば、それは時間の無駄でしょう。誰にでも私はそれをどうやって行うのですか?JavaFXで純粋にホバリングをトリガーするメニュー?
0
A
答えて
0
は、私はあなたがクラスjavafx.scene.control.ContextMenu
と方法を探していると思うshow(Node anchor, double screenX, double screenY)
+0
をチェックしてください。しかし、メインウィンドウのシーングラフの一部としてコンテキストメニューが必要です。 – Jai
1
まあ、それはあなたがlookup()
を使用している場合、それを行うことが可能です。メニューを保持しているコンテナを簡単に取ってから、setOnMouseEntered()
またはsetOnMouseExited()
を適用して、各メニューでマウスイベントを捕捉することができます。ここで
は一例です:
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
BorderPane mainPane = new BorderPane();
MenuBar menuBar = new MenuBar();
Menu editMenu = new Menu("File");
MenuItem fileMenuItem1 = new MenuItem("Item 1");
MenuItem fileMenuItem2 = new MenuItem("Item 2");
MenuItem fileMenuItem3 = new MenuItem("Item 3");
editMenu.getItems().addAll(fileMenuItem1, fileMenuItem2, fileMenuItem3);
Menu fileMenu = new Menu("Edit");
MenuItem fileMenu1 = new MenuItem("Item 1");
MenuItem fileMenu2 = new MenuItem("Item 2");
MenuItem fileMenu3 = new MenuItem("Item 3");
fileMenu.getItems().addAll(fileMenu1, fileMenu2, fileMenu3);
menuBar.getMenus().addAll(editMenu, fileMenu);
mainPane.setTop(menuBar);
Scene scene = new Scene(mainPane, 300, 300);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
// Find menubar HBox holding the menus
HBox container = (HBox) menuBar.lookup("HBox");
for(int i = 0 ; i < container.getChildren().size() ; i++) {
Node parentNode = container.getChildren().get(i);
Menu menu = menuBar.getMenus().get(i);
parentNode.setOnMouseMoved(e->{
menu.show();
});
}
}
public static void main(String[] args) {
launch(args);
}
}
私はsetOnMouseMoved
代わりのsetOnMouseEntered
を使用する理由あなたが疑問に思うかもしれません。これは、setOnMouseEntered
がメニュー間でマウスを移動している間に奇妙な動作を引き起こし、setOnMouseMoved
の使用法が修正されたためです。
[[email protected][styleClass=menu-bar], [email protected][styleClass=container], MenuBarSkin$MenuBarButton[id=null, styleClass=menu-button menu]'File', [email protected][styleClass=label]'File', Text[text="File", x=0.0, y=0.0, alignment=LEFT, origin=BASELINE, boundsType=LOGICAL_VERTICAL_CENTER, font=Font[name=System Regular, family=System, style=Regular, size=12.0], fontSmoothingType=LCD, fill=0x333333ff], [email protected][styleClass=arrow-button], [email protected][styleClass=arrow], MenuBarSkin$MenuBarButton[id=null, styleClass=menu-button menu]'Edit', [email protected][styleClass=label]'Edit', Text[text="Edit", x=0.0, y=0.0, alignment=LEFT, origin=BASELINE, boundsType=LOGICAL_VERTICAL_CENTER, font=Font[name=System Regular, family=System, style=Regular, size=12.0], fontSmoothingType=LCD, fill=0x333333ff], [email protected][styleClass=arrow-button], [email protected][styleClass=arrow]]
カスタム 'MenuBar'を使用し、そのリスナーを変更します。また
場合には、あなたがどのように私は
lookup("HBox")
真実を使用することを知っていた疑問には、私の最初の試みは、現在の情報がくれたSystem.out.println(menuBar.lookupAll("*"));
だったのですか? – user1803551['ControlsFX'](http://fxexperience.com/controlsfx/) – Sedrick