当前位置: 首页 > 知识库问答 >
问题:

JavaFX-TabPane在第一次布局后内容高度增加时不会调整大小

储嘉悦
2023-03-14

我有一个javafx应用程序,可以在滚动窗格中显示内容。此内容包括一个选项卡窗格。在选项卡窗格中,有一个VBox,其中包含可以根据用户交互更改高度的小部件,尤其是:

  • 显示更多行的表格视图

发生这种情况时,应用程序不会按预期调整大小。我知道问题是tabpane无法展开以匹配其展开的内容。

但是,如果我调整应用程序窗口的大小,或者只是选择另一个选项卡,然后回到原始选项卡,布局将正确更新。

因此,我认为缺少的只是“触发”一些重新布局。但是,当调整选项卡内容的大小时,我无法通过触发requestLayout来管理它。我尝试强制使用tabpane minHeight和maxHeight,然后调整选项卡内容的大小,但不起作用。

下面是一个显示问题的示例程序(这是JavaFX8,但我相信这个问题从那时起就没有得到解决)



import javafx.application.Application;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.stage.Stage;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.SingleSelectionModel;
import javafx.scene.layout.VBox;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.scene.control.TabPane;
import javafx.scene.control.Tab;

public class TitledPaneBench extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        ScrollPane pane = new ScrollPane();

        VBox box = new VBox();
        box.getChildren().add(new Label("Test"));
        box.getChildren().add(new Label("Test2"));
        box.getChildren().add(new Label("Test3"));


        VBox cbox = new VBox();

        cbox.getChildren().add(new Label("Test ABC"));
        cbox.getChildren().add(new Label("Test CDE"));
        cbox.getChildren().add(new Label("Test DEF"));
        cbox.getChildren().add(new Label("Test EFG"));



        TitledPane titledpane = new TitledPane("Test collapsible",cbox);
        titledpane.setExpanded(false);
        box.getChildren().add(titledpane);
        box.getChildren().add(new Label("Test4"));



        TabPane tabpane = new TabPane();
        Tab tab1 = new Tab();
        tab1.setText("First tab");
        tab1.setContent(box);
        Tab tab2 = new Tab();
        tab2.setText("Faire Valoir");
        tab2.setContent(new Label("Choucroute"));
        tabpane.getTabs().add(tab1);
        tabpane.getTabs().add(tab2);
        box.heightProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
                System.err.println("Height changed "+arg1+" <- "+arg2);
                SingleSelectionModel<Tab> selectionmodel = tabpane.getSelectionModel();
                box.requestLayout();
                tabpane.requestLayout();
            }

        });
        pane.setContent(tabpane);
        stage.setScene(new Scene(pane));
        stage.show();
    }
    public static void main(String args[]) {
        TitledPaneBench tb = new TitledPaneBench();
        tb.launch(args);
    }
}

共有1个答案

夏侯和韵
2023-03-14

看看这个,我移动了一些东西来清理它,让自己更容易阅读和理解你要找的那行是标题窗格。setOnMouseClicked(事件-

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        VBox cbox = new VBox();
        cbox.getChildren().addAll(
                new Label("Test ABC"),
                new Label("Test CDE"),
                new Label("Test DEF"),
                new Label("Test EFG")
        );
        TabPane tabpane = new TabPane();

        TitledPane titledpane = new TitledPane("Test collapsible",cbox);
        titledpane.setExpanded(false);
        //The line below should solve the issue
        titledpane.setOnMouseClicked(event -> tabpane.requestLayout());

        VBox box = new VBox();
        box.getChildren().addAll(
                new Label("Test"),
                new Label("Test2"),
                new Label("Test3"),
                titledpane,
                new Label("Test4")
        );

        tabpane.getTabs().addAll(
                new Tab("First tab",box),
                new Tab("Faire Valoir",new Label("Choucroute"))
        );

        box.heightProperty().addListener((arg0, arg1, arg2) -> {
            System.err.println("Height changed "+arg1+" <- "+arg2);
            SingleSelectionModel<Tab> selectionmodel = tabpane.getSelectionModel();//Unused
        });

        ScrollPane scrollPane = new ScrollPane(tabpane);
        stage.setScene(new Scene(scrollPane));
        stage.show();
    }
}

 类似资料:
  • 我已经开始为绘制温度数据编程这个应用程序,当屏幕调整大小时,画布也应该调整大小。它初始化正确,但当我想调整窗口大小时,draw()方法只会根据它绑定的stackpanes高度值调整高度大小,但它将完全忽略宽度。听者甚至不会开火。这我觉得很奇怪。此外,我必须为StackPane设置最小大小,否则将不会绘制任何东西。我没有使用FXML。 编辑我将第58行从setRight()更改为setCenter,

  • 问题内容: 我在一个网格中嵌套了两个网格。不幸的是,右边的嵌套网格设置行的高度,以使左边和右边的网格都具有相同的高度,额外的空间在class的div之间共享。如何设置右侧嵌套网格的行以调整内容的大小,使其与左侧嵌套行的高度相同? 问题答案: 您可以尝试 参考 您也可以只使用或

  • 我在滚动窗格中放置了一个VBox。VBox会在标题窗格进入时填充它们。但是,一旦TitledPanes填满了分配给Vbox的空间,这些TitledPanes就开始重叠。理想情况下,我希望Vbox调整自身大小,并使用ScrollPane导航。 我将Vbox最大高度设置为。我已经在滚动窗格中添加了一个监听器来监听VBox大小的变化,但没有成功。有什么建议吗?

  • 调整内存布局 上一节中我们看到,编译出的程序默认被放到了从 0x11000 开始的位置上: 运行输出 start address: 0x0000000000011000 ... Program Header: PHDR off 0x0000000000000040 vaddr 0x0000000000010040 ... LOAD off 0x0000000000000

  • 我正在为我的项目使用 iTextPDF 免费标记。基本上,我使用免费标记加载并填充一个HTML模板,然后使用iTextPDF的将其呈现为PDF。 模板是: 这是我的代码: 这段代码运行良好,但是固定高度是一个问题。 即假设: 生成的文档是: 相反,如果我用 生成的文档是: 如你所见,在最后一份文件中,我有两页。我希望只有一个页面,它根据内容的高度改变其高度。 iText有可能实现这样的事情吗?

  • 我有一个包含多个的布局,底部有一个按钮。当键盘显示时,我希望我的布局保持在键盘上方。我搜索这个问题,发现应该在清单的标签中放入