Javafx TabPane收缩到最大的子级

Javafx TabPane收缩到最大的子级,javafx,javafx-8,Javafx,Javafx 8,我正在绞尽脑汁来做这件事。基本上我有两个标签。一开始,其中一个有100px大的内容(我事先不知道大小,这只是一个例子),另一个没有内容。 在一些事件之后,我向以前的空选项卡添加了一个高度为200px的东西 听上去都很好。TabPane正确调整大小(在我调用requestLayout()之后)并适合新内容 现在,如果我删除200px的内容,我希望选项卡窗格返回到100px高,也就是说,最大的项目仍然保留在选项卡上,但是它仍然保持在200px,给我留下了大量的空白空间。有人能给我一个解决这个问题的线

我正在绞尽脑汁来做这件事。基本上我有两个标签。一开始,其中一个有100px大的内容(我事先不知道大小,这只是一个例子),另一个没有内容。 在一些事件之后,我向以前的空选项卡添加了一个高度为200px的东西

听上去都很好。TabPane正确调整大小(在我调用requestLayout()之后)并适合新内容

现在,如果我删除200px的内容,我希望选项卡窗格返回到100px高,也就是说,最大的项目仍然保留在选项卡上,但是它仍然保持在200px,给我留下了大量的空白空间。有人能给我一个解决这个问题的线索吗

这是我的演示代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TabPaneTest extends Application {


    @Override
    public void start(Stage primaryStage) throws Exception {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Test 1");
        Tab tab2 = new Tab("Test 2");

        final Pane tab2Content = new Pane();
        tab2Content.getStyleClass().add("tab2Content");
        tab2.setContent(tab2Content);

        tabPane.getTabs().addAll(tab1, tab2);

        Button addSquare = new Button("Add");
        addSquare.setOnAction(event -> {
            final Pane tab1Content = new Pane();
            tab1Content.getStyleClass().add("tab1Content");

            tab1.setContent(tab1Content);

            tabPane.requestLayout();
        });

        Button removeSquare = new Button("Remove");
        removeSquare.setOnAction(event -> {
            tab1.setContent(null);
            tabPane.requestLayout();
        });
        HBox buttons = new HBox(addSquare, removeSquare);


        VBox vBox = new VBox(tabPane, buttons);
        Scene scene = new Scene(vBox, 500, 400);
        scene.getStylesheets().add(LargeTooltipSample.class.getResource("tabPaneTest.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
这是我的CSS(只是为了更好地可视化内容):

提前感谢

试试这个:

@Override
public void start(Stage primaryStage) throws Exception {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Test 1");
        Tab tab2 = new Tab("Test 2");

        final Pane tab2Content = new Pane();
        final Pane tab1Content = new Pane();

        tab2Content.getStyleClass().add("tab2Content");
        tab2.setContent(tab2Content);

        tabPane.getTabs().addAll(tab1, tab2);

        Button addSquare = new Button("Add");
        Button removeSquare = new Button("Remove");
        HBox buttons = new HBox(addSquare, removeSquare);
        VBox vBox = new VBox(tabPane, buttons);


        double[] tabPaneOriginalHeight = new double[1];//Used to hold tabPane's original height.

        addSquare.setOnAction(event -> {  

        System.out.println(tabPane.getHeight());
        tab1Content.getStyleClass().add("tab1Content");
        tab1.setContent(tab1Content);    
        System.out.println(tabPane.getHeight());
        tabPane.setPrefHeight(200);//sets the height to 200 after adding tabl1 content
        tabPane.requestLayout();


    });


    removeSquare.setOnAction(event -> {
        System.out.println(tabPane.getHeight());

        tab1Content.getStyleClass().remove("tab1Content");
        tab1.setContent(tab1Content);
        System.out.println(tabPane.getHeight());
        tabPane.setPrefHeight(100);//sets the height to 100 after removing tab1 content
        tabPane.requestLayout(); 
    });




        Scene scene = new Scene(vBox, 500, 400);
        scene.getStylesheets().add(JavaFXApplication16.class.getResource("tabPaneTest.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

有人会有一个更好的绑定方法。这在本例中是可行的,但想象一下下面的场景:200px部件已经就位。然后移除它,只留下100px的一个。它不会使用您的方法重新缩放到100px,因为“原始高度”是200px而不是100px:(很好,而不是tabPane.setPrefHeight(tabPaneOriginalHeight[0]);请尝试tabPane.setPrefHeight(100);我在Netbeans中测试了它。它似乎工作正常。它符合您的标准吗?不幸的是,不是Sedrick。您正在根据给出的示例调整问题。我需要创建一些可以更广泛地工作的东西,例如,我不知道要恢复到的像素大小。理想情况下,我只需检查每个选项卡内容,并查看最高的Item,但我之前不知道
@Override
public void start(Stage primaryStage) throws Exception {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Test 1");
        Tab tab2 = new Tab("Test 2");

        final Pane tab2Content = new Pane();
        final Pane tab1Content = new Pane();

        tab2Content.getStyleClass().add("tab2Content");
        tab2.setContent(tab2Content);

        tabPane.getTabs().addAll(tab1, tab2);

        Button addSquare = new Button("Add");
        Button removeSquare = new Button("Remove");
        HBox buttons = new HBox(addSquare, removeSquare);
        VBox vBox = new VBox(tabPane, buttons);


        double[] tabPaneOriginalHeight = new double[1];//Used to hold tabPane's original height.

        addSquare.setOnAction(event -> {  

        System.out.println(tabPane.getHeight());
        tab1Content.getStyleClass().add("tab1Content");
        tab1.setContent(tab1Content);    
        System.out.println(tabPane.getHeight());
        tabPane.setPrefHeight(200);//sets the height to 200 after adding tabl1 content
        tabPane.requestLayout();


    });


    removeSquare.setOnAction(event -> {
        System.out.println(tabPane.getHeight());

        tab1Content.getStyleClass().remove("tab1Content");
        tab1.setContent(tab1Content);
        System.out.println(tabPane.getHeight());
        tabPane.setPrefHeight(100);//sets the height to 100 after removing tab1 content
        tabPane.requestLayout(); 
    });




        Scene scene = new Scene(vBox, 500, 400);
        scene.getStylesheets().add(JavaFXApplication16.class.getResource("tabPaneTest.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }