Javafx 如何关闭除所选选项卡之外的其他选项卡

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

我想用ContextMenu实现TabPane以关闭除所选选项卡之外的其他选项卡

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你完全正确-没想过这个。