2014-12-06 57 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

相关问题