Tabs JDK 1.8 JavaFX选项卡窗格引发NullPointerException

Tabs JDK 1.8 JavaFX选项卡窗格引发NullPointerException,tabs,nullpointerexception,javafx,Tabs,Nullpointerexception,Javafx,我想在回答这个问题之前说明以下代码在JDK1.7中工作得非常好。这里的目标是创建一个选项卡窗格,末尾有一个选项卡(文本设置为“+”),这样每当选择此选项卡时,程序都会在选项卡窗格中创建一个新选项卡。此功能运行良好。问题是,当您通过X关闭新选项卡时,它会切换到“添加选项卡”,创建一个新选项卡,然后在一些JDK代码中抛出以下NullPointerException(应用程序现在显示两个完全相同的新选项卡): 使用平台C:\Program Files\Java\jdk1.8.0\jre/bin/Jav

我想在回答这个问题之前说明以下代码在JDK1.7中工作得非常好。这里的目标是创建一个选项卡窗格,末尾有一个选项卡(文本设置为“+”),这样每当选择此选项卡时,程序都会在选项卡窗格中创建一个新选项卡。此功能运行良好。问题是,当您通过X关闭新选项卡时,它会切换到“添加选项卡”,创建一个新选项卡,然后在一些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 在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;
    }

}
公共类TestTabApp扩展应用程序{
私有选项卡窗格选项卡窗格;
私有选项卡addTab;
私有选项卡当前选项卡;
@凌驾
公共无效开始(阶段primaryStage){
//创建选项卡窗格和“添加选项卡”以添加新选项卡。
tabPane=新tabPane();
tabPane.setTabClosingPolicy(TabClosingPolicy.SELECTED_选项卡);
addTab=新选项卡(“+”);
addTab.setClosable(false);
tabPane.getTabs().add(addTab);
//添加侦听器以侦听选项卡选择的更改。
tabPane.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void change(observevalue我也在Oracle论坛上发布了这篇文章,并收到了David Grive的回复:

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

作为一种解决方法,使用以下CSS关闭选项卡关闭动画

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

我创建了跟踪问题的工具。

警告:问题在8u20中标记为已解决,但如果我
清除()选项卡,然后使用
setAll()
过早设置选项卡,或者使用
add()在一行中添加太多选项卡,我会在8u25中看到相同(或类似)的问题
。在这两种情况下,禁用“关闭”选项卡动画可以解决问题。