tabs - JDK 1.8 JavaFX 选项卡 Pane 抛出 NullPointerException

标签 tabs nullpointerexception javafx

我想通过声明以下代码在 JDK 1.7 中工作得很好来作为这个问题的序言。此处的目标是创建一个选项卡 Pane ,其末尾有一个选项卡(文本设置为“+”),以便无论何时选择此选项卡,程序都会在选项卡 Pane 中创建一个新选项卡。此功能工作正常。问题是,当您通过 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;
    }

}

有没有人想过为什么现在在 JDK 1.8 中会发生这种情况,但在 1.7 中却没有? 1.8 有错误吗?

最佳答案

我还在 Oracle 论坛上发布了这个,并收到了 David Grieve 的回复:

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

作为解决方法,使用以下 CSS 代码关闭选项卡关闭动画。

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

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

关于tabs - JDK 1.8 JavaFX 选项卡 Pane 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22696715/

相关文章:

android - 使用 fragment 在选项卡中启动 Activity

javascript - 使用 JavaScript 在新选项卡中打开 PDF 文件

Java `InvocationTargetException` 通过反射进行类实例化

ios - 组合选项卡 View 和分割 View

java.lang.NullPointerException 和未知来源

java - 显示在第二个 Activity 中设置的第一个 Activity 的数据

javafx - 如何使用三个或更多键创建 JavaFX KeyCombination?

JavaFX 在全屏模式下改变场景

debugging - 如何使用 ScenicView 检查子窗口(ContextMenus、PopupControls 等)

html - 如何动态调整导航选项卡的宽度以使其填满屏幕