在我的JFX应用程序中,我创建了一个数组列表来跟踪选项卡。我主要是想知道哪些选项卡被用户关闭,以便我处理因删除特定选项卡而发生的更改。
我尝试使用下面的代码从数组列表中删除已关闭的选项卡。我使用setOnClosed
方法来触发此代码:
String id = closedTab.getId();
(第一次创建选项卡时会分配此ID,因此它不为空。)
for (Tab aTab : allTabsList) {
if (aTab.getId().equals(id)) {
allTabsList.remove(aTab);
break;
}
}
我在getId
方法上得到一个空指针异常。不知道为什么。
所以我试着这样做,哪种作品:
for (Tab aTab : allTabsList) {
if (aTab.equals(closedTab)) {
allTabsList.remove(closedTab);
if allTabsList.contains(closedTab){
System.out.println("tab is still there");
}
}
}
删除之后,我检查了arrayList是否包含此选项卡,并且代码不会进入if语句,因此它不应该使用它。但是,数组列表大小不会更改。
有什么想法吗?
答案 0 :(得分:1)
我其实喜欢更好的方法。这是:
设置如下:
我创建了一个“MyTab”类来包装JavafX Tab对象。我认为包装它会给我一些容易嵌入字段的控件。 javaFX Tab变量的名称如下:fxTab。
fxTab从单独的FXML文件中获取其内容。在下面的代码中,内容/场景的根是“sceneRoot”。这样,我可以创建多个fxTab(我程序中的部分功能)。
然后我为MyTab对象创建了一个ID变量,并通过fxTab.serUserData()将其传递给fxTab;
然后我添加一个setOnClosed方法并使用该ID来识别fxTab已关闭,然后从arrayList(allMyTabs)中删除其包装器。当关闭fxTab时,我在我的arrayList中查找所有MyTab对象,并比较userData以识别我需要的对象。当然,ID变量总是递增的。因此,没有类似ID的标签。
sceneRoot = (AnchorPane) loader.load();//load the tab scene root from the FXML loader
Tab fxTab = new Tab();
fxTab.setContent(sceneRoot);//add the tab scene root node to the tab
fxTab.setClosable(true);//make the tab closable
fxTab.setId(ID.toString());//set its ID.
//add a close action to the created tab stage
fxTab.setOnClosed(new EventHandler<Event>() {
@Override
public void handle(Event t) {
Tab fxTab = (Tab) t.getSource();//get the source of the action...
for (MyTab myTabObj: allMyTabs) {
if (myTabObj.ID.equals(fxTab.getUserData())) {
fxTab = myTabObj;//f so, this is the one
break;//break the loop
}
}
allMyTabs.remove(myTabObj);
System.out.println("You closed Tab: " + fxTab.getUserData());
System.out.println("Total number of remaining tabs is:" + allMyTabs.size());
}
});