Javafx 如何关闭除所选选项卡之外的其他选项卡
我想用ContextMenu实现TabPane以关闭除所选选项卡之外的其他选项卡Javafx 如何关闭除所选选项卡之外的其他选项卡,javafx,javafx-8,Javafx,Javafx 8,我想用ContextMenu实现TabPane以关闭除所选选项卡之外的其他选项卡 public class MainApp extends Application { @Override public void start(Stage primaryStage) { primaryStage.setTitle("Tabs"); Group root = new Group(); Scene scene = new S
public class MainApp extends Application
{
@Override
public void start(Stage primaryStage)
{
primaryStage.setTitle("Tabs");
Group root = new Group();
Scene scene = new Scene(root, 400, 250, Color.WHITE);
final TabPane tabPane = new TabPane();
BorderPane borderPane = new BorderPane();
for (int i = 0; i < 5; i++)
{
Tab tab = new Tab();
tab.setText("Tab" + i);
HBox hbox = new HBox();
hbox.getChildren().add(new Label("Tab" + i));
hbox.setAlignment(Pos.CENTER);
tab.setContent(hbox);
tabPane.getTabs().add(tab);
ContextMenu contextMenu = new ContextMenu();
MenuItem close = new MenuItem();
MenuItem closeOthers = new MenuItem();
MenuItem closeAll = new MenuItem();
close.setText("Close");
closeOthers.setText("Close Others");
closeAll.setText("Close All");
contextMenu.getItems().addAll(close, closeOthers, closeAll);
tab.setContextMenu(contextMenu);
final ObservableList<Tab> tablist = tabPane.getTabs();
close.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
}
});
closeOthers.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
tabPane.getTabs().removeAll();
}
});
closeAll.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
tabPane.getTabs().removeAll(tablist);
}
});
}
// bind to take available space
borderPane.prefHeightProperty().bind(scene.heightProperty());
borderPane.prefWidthProperty().bind(scene.widthProperty());
borderPane.setCenter(tabPane);
root.getChildren().add(borderPane);
primaryStage.setScene(scene);
primaryStage.show();
}
}
public类MainApp扩展应用程序
{
@凌驾
公共无效开始(阶段primaryStage)
{
初级阶段。设置标题(“制表符”);
组根=新组();
场景=新场景(根,400,250,颜色.白色);
final TabPane TabPane=新TabPane();
BorderPane BorderPane=新的BorderPane();
对于(int i=0;i<5;i++)
{
Tab Tab=新选项卡();
tab.setText(“tab”+i);
HBox HBox=新的HBox();
hbox.getChildren().add(新标签(“Tab”+i));
hbox.设置校准(位置中心);
tab.设置内容(hbox);
tabPane.getTabs().add(tab);
ContextMenu ContextMenu=新建ContextMenu();
MenuItem close=新建MenuItem();
MenuItem closeOthers=新建MenuItem();
MenuItem closeAll=新MenuItem();
close.setText(“close”);
closeOthers.setText(“closeOthers”);
closeAll.setText(“全部关闭”);
contextMenu.getItems().addAll(关闭、关闭其他、关闭全部);
tab.setContextMenu(contextMenu);
最终ObservableList tablist=tabPane.getTabs();
close.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(ActionEvent事件)
{
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
}
});
closeOthers.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(ActionEvent事件)
{
tabPane.getTabs().removeAll();
}
});
setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(ActionEvent事件)
{
tabPane.getTabs().removeAll(tablist);
}
});
}
//绑定以占用可用空间
borderPane.prefHeightProperty().bind(scene.heightProperty());
borderPane.prefWidthProperty().bind(scene.widthProperty());
边框窗格。设置中心(选项卡窗格);
root.getChildren().add(边框窗格);
初级阶段。场景(场景);
primaryStage.show();
}
}
但代码不起作用。你能帮我实现这个解决方案吗
有没有更好的方法来实现这一点?这非常简单。只需遍历tablist中的所有选项卡对象,并标记应该删除的对象。迭代后,删除标记的选项卡对象
closeOthers.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
// ArrayList of Tab-Objects in which we store Tabs which should be deleted..
ArrayList<Tab> markedTabs = new ArrayList<>();
// Iterate through all Tabs in tablist
for (Tab tab : tablist) {
// Is the tab the current active tab? if not, add it to the markedTabs-ArrayList
if (tab != tabPane.getSelectionModel().getSelectedItem())
markedTabs.add(tab);
}
// Remove them from the tabPane..
tabPane.getTabs().removeAll(markedTabs);
}
});
closeOthers.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(ActionEvent事件)
{
//用于存储应删除选项卡的选项卡对象的ArrayList。。
ArrayList markedTabs=新的ArrayList();
//遍历tablist中的所有选项卡
用于(选项卡:表格列表){
//该选项卡是否为当前活动选项卡?如果不是,请将其添加到markedTabs ArrayList中
如果(tab!=tabPane.getSelectionModel().getSelectedItem())
标记的选项卡。添加(选项卡);
}
//从选项卡窗格中删除它们。。
tabPane.getTabs().removeAll(markedTabs);
}
});
我不明白你想做什么。为什么要调用tabPane.getTabs().removeAll()在closeOthers
处理程序中的code>?(这个方法可能不会做你想做的事,但它肯定不会做你想做的事。)这只是一个小的未完成的代码示例。嗯。。。为什么不retainal(selectedTab)
你需要什么?测试代码,你会发现它不工作。retainal(…)
对我也很好。谢谢你的回答。不。。retainAll的作用就是:删除所有不在集合中的项目。无需复制List@PeterPenzov为什么要将这样一个古怪的(=不使用核心功能)标记为解决方案?重新发明轮子是错误的。@kleopatra你完全正确-没想过这个。