我想通过声明下面的代码在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中有错误吗?
答案 0 :(得分:2)
我也在Oracle论坛上发布了此消息并收到David Grieve的回复:
这显然是TabPaneSkin代码中的一个错误。似乎正在发生的事情是在选项卡删除动画完成之前删除选项卡。如果最后一个标签被删除,代码会自动添加标签,这可能会加剧这个问题,但核心代码不应该像这样。
作为一种解决方法,请使用以下CSS来关闭标签关闭动画。
tabPane.setStyle("-fx-close-tab-animation: none;");