2014-12-06 48 views
0

似乎沒有API以編程方式「選擇」ContextMenu項目?通過選擇我的意思是相當於上下鍵(或將鼠標懸停在項目上)。當顯示一個ContextMenu時,我只需要選擇第一個項目。我試圖在顯示菜單時觸發一個關鍵事件,但沒有發生任何事情。也許我錯誤地構造了事件。ContextMenu並以編程方式選擇項目

回答

3

爲了得到這個工作,我們可以使用一些私有API。 ContextMenu皮膚(ContextMenuSkin)使用ContextMenuContent對象作爲所有項目的容器。

我們只需要請求關注這些項目中的第一項。

但爲此,我們可以使用一些查找來找到第一個menu-item CSS選擇器。這必須在舞臺顯示後完成。

這個例子將顯示上下文菜單,焦點位於第一個項目:

@Override 
public void start(Stage primaryStage) { 

    MenuItem cmItem1 = new MenuItem("Item 1"); 
    cmItem1.setOnAction(e->System.out.println("Item 1")); 
    MenuItem cmItem2 = new MenuItem("Item 2"); 
    cmItem2.setOnAction(e->System.out.println("Item 2")); 

    final ContextMenu cm = new ContextMenu(cmItem1,cmItem2); 

    Scene scene = new Scene(new StackPane(), 300, 250); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

    scene.setOnMouseClicked(t -> { 
     if(t.getButton()==MouseButton.SECONDARY){ 
      cm.show(scene.getWindow(),t.getScreenX(),t.getScreenY()); 

      // Request focus on first item 
      cm.getSkin().getNode().lookup(".menu-item").requestFocus(); 
     } 
    });   
} 
+0

正是我需要的。謝謝! – user2499946 2014-12-06 18:18:24

+0

如何選擇2或n-n項目?我使用這個但不工作(contextMenu.getSkin()。getNode()。lookup(「.menu-item:nnth-child(4)」)。requestFocus() ;) – GOXR3PLUS 2016-05-29 03:27:19

+0

使用'cm.getSkin()。getNode()。lookupAll(「。menu-item」)'獲取所有項目的集合,然後迭代以獲得所需的項目。 – 2016-05-29 10:13:21

相關問題