我想通过声明以下代码在 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;");
关于tabs - JDK 1.8 JavaFX 选项卡 Pane 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22696715/