2017-12-01 13 views
0

メニューに関連するいくつかのJavaFXクラスを見てきましたが、私が欲しいものを見つけることができませんでした。 MenuBarのように動作するものを実装したいと思いますが、クリック時ではなく、ホバー上でメニューを開くことが必要な場合を除きます。私は自分自身で一から何かを構築することはできますが、それと似たようなことができるものがあれば、それは時間の無駄でしょう。誰にでも私はそれをどうやって行うのですか?JavaFXで純粋にホバリングをトリガーするメニュー?

+0

カスタム 'MenuBar'を使用し、そのリスナーを変更します。また

場合には、あなたがどのように私はlookup("HBox")真実を使用することを知っていた疑問には、私の最初の試みは、現在の情報がくれたSystem.out.println(menuBar.lookupAll("*"));だったのですか? – user1803551

+0

['ControlsFX'](http://fxexperience.com/controlsfx/) – Sedrick

答えて

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]]