单击选项卡时,JavaFX不执行任何操作

时间:2019-11-13 09:50:35

标签: java events javafx tabs

当我在TabPane中单击选项卡时,我想取消选项卡更改。我想手动更改标签,而不是通过用户单击标签来更改。

我该怎么做?预先感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用事件过滤器来阻止您不希望标签页眉区域接收的事件。以下代码阻止了MOUSE_PRESSED事件,该事件负责更改单击时的选项卡。内容区域内的任何单击都不会被阻止。

@Override
public void start(Stage stage) throws IOException {
    Button btn = new Button("Click");
    TabPane tp = new TabPane(new Tab("tab1", new StackPane(btn)), new Tab("tab2"));
    btn.setOnAction(event-> {
        tp.getSelectionModel().select(1); // change tab programmatically
    });

    tp.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
        Node n = event.getPickResult().getIntersectedNode();

        boolean outsideContentArea = true;

        // iterate from node actually clicked to the TabPane
        // and look for the content area
        while (outsideContentArea && (n != tp)) {
            if (n.getStyleClass().contains("tab-content-area")) {
                outsideContentArea = false;
            }
            n = n.getParent();
        }
        if (outsideContentArea) {
            // stop event propagation to any part
            // of the TabPane outside the content area
            event.consume();
        }
    });

    Scene scene = new Scene(tp, 300, 300);

    stage.setScene(scene);
    stage.show();
}

答案 1 :(得分:0)

如果您想要这种类型的流程,可以通过隐藏选项卡以使它们无法被单击,然后添加按钮来迭代每个选项卡来实现此目的

您将需要以下行来隐藏标签

tabPane.setStyle("-fx-tab-max-height: -2;");//You can still see tabs at -1 not sure why

请注意,如果要隐藏标题空间(如下面的应用程序所示),则需要通过css进行操作,并且可以忽略上一行

.tab-pane {
    -fx-tab-max-height: 0 ;
}
.tab-pane .tab-header-area {
    visibility: hidden ;
}

,您还需要查看按钮的设置方式,以转到下一个选项卡和上一个选项卡,因为我不确定您的应用程序看起来像我刚刚使用按钮所做的那样,但是您可以使用相同的操作想到他就动了

    Button buttonPlus = new Button("+");
    buttonPlus.setOnAction(event -> {
        int selectedIndex = tabPane.getSelectionModel().getSelectedIndex();
        if(selectedIndex<tabPane.getTabs().size()-1)
            tabPane.getSelectionModel().select(++selectedIndex);
    });

    Button buttonMinus = new Button("-");
    buttonMinus.setOnAction(event -> {
        int selectedIndex = tabPane.getSelectionModel().getSelectedIndex();
        if(selectedIndex>0)
            tabPane.getSelectionModel().select(--selectedIndex);
    });

就像抬起头一样,您可以通过传递像tabPane.getSelectionModel().select(index);这样的索引或通过传递像tabPane.getSelectionModel().select(tab);这样的特定选项卡来更改选项卡

一旦创建并添加到场景中,您将可以轻松单击每个选项卡

在下面查看我的申请,如果您有任何疑问,请告诉我

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        TabPane tabPane = new TabPane();
        tabPane.setStyle("-fx-tab-max-height: -2;");//You can still see tabs at -1

        createNewTab(tabPane);
        createNewTab(tabPane);
        createNewTab(tabPane);

        stage.setScene(new Scene(tabPane));
        stage.show();
    }

    private void createNewTab(TabPane tabPane){
        Tab tab = new Tab();
        tab.setClosable(false);
        addNodesToTab(tabPane, tab);

        tabPane.getTabs().add(tab);
    }

    private void addNodesToTab(TabPane tabPane, Tab tab){

        Button buttonPlus = new Button("+");
        buttonPlus.setOnAction(event -> {
            int selectedIndex = tabPane.getSelectionModel().getSelectedIndex();
            if(selectedIndex<tabPane.getTabs().size()-1)
                tabPane.getSelectionModel().select(++selectedIndex);
        });

        Button buttonMinus = new Button("-");
        buttonMinus.setOnAction(event -> {
            int selectedIndex = tabPane.getSelectionModel().getSelectedIndex();
            if(selectedIndex>0)
                tabPane.getSelectionModel().select(--selectedIndex);
        });

        tab.setContent(new VBox(new Label("Tab:"+tabPane.getTabs().size()),buttonPlus, buttonMinus));
    }
}