JDK 1.8 JavaFX选项卡窗格抛出NullPointerException

时间:2014-03-27 18:56:27

标签: tabs nullpointerexception javafx

我想通过声明下面的代码在JDK 1.7中完美运行来预先提出这个问题。这里的目标是创建一个选项卡窗格,其末尾有一个选项卡(文本设置为“+”),这样无论何时选中此选项卡,程序都会在选项卡窗格中创建一个新选项卡。此功能正常。问题是,当您通过X关闭New Tab时,它会切换到“Add Tab”,创建一个新选项卡,然后在某些JDK代码中抛出以下NullPointerException(该应用程序现在显示两个相同的新选项卡确切的对象):

使用平台C:\ Program Files \ Java \ jdk1.8.0 \ jre / bin / java执行C:\ Users \ XXXXXX \ Documents \ NetBeansProjects \ TestJavaFx \ dist \ run2082574567 \ TestJavaFx.jar 显示java.lang.NullPointerException     at com.sun.javafx.scene.control.skin.TabPaneSkin $ TabHeaderSkin.access $ 302(TabPaneSkin.java:1040) ....

我已将故障代码减少到最低限度以显示问题,具体如下:

public class TestTabApp extends Application {

    private TabPane tabPane;
    private Tab addTab;
    private Tab currentTab;

    @Override
    public void start(Stage primaryStage) {

        //Create the tab pane and the 'addTab' for adding new tabs.
        tabPane = new TabPane();
        tabPane.setTabClosingPolicy(TabClosingPolicy.SELECTED_TAB);

        addTab = new Tab("+");
        addTab.setClosable(false);
        tabPane.getTabs().add(addTab);

        //Add a listener to listen for changes to tab selection.
        tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
            @Override
            public void changed(ObservableValue<? extends Tab> observable, Tab oldSelectedTab, Tab newSelectedTab) {

                //If we change to the addTab create a
                //new tab and change selection.
                if (newSelectedTab == addTab) {
                    //Create the new tab.
                    createNewTab();
                } else {
                    currentTab = newSelectedTab;
                }
            }
        });
        //Create a new tab for initial load of the app
        createNewTab();

        StackPane root = new StackPane();
        root.getChildren().add(tabPane);

        Scene scene = new Scene(root, 500, 500);

        primaryStage.setTitle("Tab Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    private Tab createNewTab() {
        Tab newTab = new Tab("New Tab");
        newTab.setClosable(true);
        tabPane.getTabs().add(tabPane.getTabs().size() - 1, newTab);
        tabPane.getSelectionModel().select(newTab);
        return newTab;
    }

}

有没有人对JDK 1.8现在发生这种情况有什么想法,而不是1.7? 1.8中有错误吗?

1 个答案:

答案 0 :(得分:2)

我也在Oracle论坛上发布了此消息并收到David Grieve的回复:

这显然是TabPaneSkin代码中的一个错误。似乎正在发生的事情是在选项卡删除动画完成之前删除选项卡。如果最后一个标签被删除,代码会自动添加标签,这可能会加剧这个问题,但核心代码不应该像这样。

作为一种解决方法,请使用以下CSS来关闭标签关闭动画。

tabPane.setStyle("-fx-close-tab-animation: none;");

我创建了https://javafx-jira.kenai.com/browse/RT-36443来跟踪问题。

相关问题