JavaFX ContextMenu加速器从错误的选项卡触发

时间:2015-12-10 09:26:55

标签: javafx tabs contextmenu javafx-8

我有一个TabPane,其中有两个标签,每个标签都有TableView,其中有一个上下文菜单。两个上下文菜单有重复的加速器,但我希望只有当前选定的选项卡才能响应。但是发生的事情只是最后添加的Tab似乎得到了事件,即使它没有被选中。 以下是完整的示例代码:

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
    Tab t1 = new Tab("Tab 1");
    TableView<Void> tv1 = new TableView<>();
    t1.setContent(tv1);
    MenuItem mi1 = new MenuItem("Action 1");
    mi1.setAccelerator(KeyCombination.valueOf("F3"));
    mi1.setOnAction(event->System.out.println("Action 1!"));
    ContextMenu ctx1 = new ContextMenu(mi1);
    tv1.setContextMenu(ctx1);

    Tab t2 = new Tab("Tab 2");
    TableView<Void> tv2 = new TableView<>();
    t2.setContent(tv2);
    MenuItem mi2 = new MenuItem("Action 2");
    mi2.setAccelerator(KeyCombination.valueOf("F3"));
    mi2.setOnAction(event->System.out.println("Action 2!"));
    ContextMenu ctx2 = new ContextMenu(mi2);
    tv2.setContextMenu(ctx2);

    TabPane tabPane = new TabPane(t1, t2);
    tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
    primaryStage.setScene(new Scene(tabPane));
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}
}

我期待“行动1!”选择选项卡1时打印,然后执行“操作2!”选择Tab 2时要打印,但实际上是“Action 2!”无论选择哪个选项卡,都会打印。 如何解决此问题,以便根据当前可见的哪个选项卡(TableView)执行正确的操作?

1 个答案:

答案 0 :(得分:3)

我猜您遇到了https://bugs.openjdk.java.net/browse/JDK-8088068(请参阅此处了解解决方法)。 JavaFX并没有为在多个MenuItem中安装相同的加速器做好准备。