有一个ContextMenu,它有两个选项,当用鼠标右键按下第二个选项(代码中的第2项)时,我希望它打印出一些文本,这样我就知道我确实激活了它。到目前为止,当我点击第二个鼠标按钮时,没有发生任何事情。
我还没有太多的Eventhandlers经验,所以如果我犯了一个中午的错误,我很抱歉。
private void maakContextMenu() {
menu = new ContextMenu();
MenuItem item = new MenuItem("Kleur Assen");
MenuItem item2 = new MenuItem("tweede optie");
final LissajousCanvas canvas = this;
item.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
new KiesKleur(canvas).show();
}
});
item2.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent t) {
System.out.println("in the loop");
if(t.getSource()==MouseButton.SECONDARY){
System.out.println("in too deep");
}
new KiesKleur(canvas).show();
}
});
menu.getItems().addAll(item, item2);
}
MenuItem
实际上不是Node
,因此它不像Node
那样是场景图的一部分。所以我真的不确定这是否是一个bug;我认为它可能只实现了EventTarget
,所以它可以专门生成ActionEvent
s。您会注意到没有可用的setOnMouseClicked(...)
方法。
这里有一个变通方法。我不知道为什么它只适用于MOUSE_PRESSED
而不适用于MOUSE_CLICKED
,但它可能与生成操作事件的默认鼠标事件处理有关:
private void maakContextMenu() {
menu = new ContextMenu();
MenuItem item = new MenuItem("", new Label("Kleur Assen"));
Label menuItem2Label = new Label("tweede optie");
MenuItem item2 = new MenuItem("", menuItem2Label);
final LissajousCanvas canvas = this;
item.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
new KiesKleur(canvas).show();
}
});
menuItem2Label.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent t) {
System.out.println("in the loop");
if(t.getButton()==MouseButton.SECONDARY){
System.out.println("in too deep");
}
new KiesKleur(canvas).show();
}
});
menu.getItems().addAll(item, item2);
}