Tabs JDK 1.8 JavaFX选项卡窗格引发NullPointerException
我想在回答这个问题之前说明以下代码在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) 我已将故障代码减少到最低限度以显示问题,如下所示: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
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中看到相同(或类似)的问题
。在这两种情况下,禁用“关闭”选项卡动画可以解决问题。