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

JavaFX动态网格行高度调整

夏侯林
2023-03-14

我目前正在做一个项目,我找不到任何解决方案。我希望Gridpane行的高度从该行中一个特定列的宽度动态计算。整个Gridpane必须可调整大小,其余可用空间应位于下面的另一行,以便根据该单元格内的元素保留该单元格的纵横比。孩子们,有什么想法吗?

public class GridPaneControl extends GridPane {

    private int index;
    private Label startLabel;
    private Label endLabel;

    private HBox inputCellsContainer;
    private HBox outputCellsContainer;

    private Button inputOutputNextButton;
    private Button inputOutputPreviousButton;

    public GridPaneControl() {

        setGridLinesVisible(true);
        initialization();

        ColumnConstraints cc0 = new ColumnConstraints();
        cc0.setMaxWidth(Double.MAX_VALUE);
        cc0.setHgrow(Priority.NEVER);

        ColumnConstraints cc1 = new ColumnConstraints();
        cc1.setMaxWidth(Double.MAX_VALUE);

        ColumnConstraints cc2 = new ColumnConstraints();
        cc2.setMaxWidth(Double.MAX_VALUE);
        cc2.setHgrow(Priority.NEVER);

        RowConstraints rc0 = new RowConstraints();
        rc0.setVgrow(Priority.ALWAYS);
        rc0.setFillHeight(false);
        rc0.setMaxHeight(Double.MAX_VALUE);

        RowConstraints rc1 = new RowConstraints();
        rc1.setVgrow(Priority.ALWAYS);
        rc1.setFillHeight(false);
        rc1.setMaxHeight(Double.MAX_VALUE);

        RowConstraints rc2 = new RowConstraints();
        rc2.setVgrow(Priority.NEVER);

        RowConstraints rc3 = new RowConstraints();
        rc3.setVgrow(Priority.ALWAYS);

        getColumnConstraints().addAll(cc0, cc1, cc2);
        getRowConstraints().addAll(rc0, rc1, rc2, rc3);

    }

    private void initialization() {

        inputCellsContainer = new HBox(0);
        outputCellsContainer = new HBox(0);

        GridPane.setValignment(inputCellsContainer, VPos.BOTTOM);
        GridPane.setValignment(outputCellsContainer, VPos.TOP);

        inputOutputPreviousButton = new Button("<<");
        inputOutputPreviousButton.maxWidth(Double.MAX_VALUE);
        GridPane.setHgrow(inputOutputPreviousButton, Priority.NEVER);
        GridPane.setVgrow(inputOutputPreviousButton, Priority.NEVER);
        GridPane.setMargin(inputOutputPreviousButton, new Insets(5));

        inputOutputNextButton = new Button(">>");
        inputOutputNextButton.maxWidth(Double.MAX_VALUE);
        GridPane.setHgrow(inputOutputNextButton, Priority.NEVER);
        GridPane.setVgrow(inputOutputNextButton, Priority.NEVER);
        GridPane.setMargin(inputOutputNextButton, new Insets(5));

        for (int i = 0; i < 32; i++) {

            InputOutputCell cellIn = new InputOutputCell(String.format("%02X", i), Color.AQUA, 0);
            InputOutputCell cellOut = new InputOutputCell(String.format("%02X", i), Color.BEIGE, 1);
            HBox.setHgrow(cellIn, Priority.ALWAYS);
            HBox.setHgrow(cellOut, Priority.ALWAYS);

            inputCellsContainer.getChildren().add(cellIn);
            outputCellsContainer.getChildren().add(cellOut);

        }

        GridPane.setHgrow(inputCellsContainer, Priority.ALWAYS);
        GridPane.setHgrow(outputCellsContainer, Priority.ALWAYS);
        GridPane.setVgrow(inputCellsContainer, Priority.ALWAYS);
        GridPane.setVgrow(outputCellsContainer, Priority.ALWAYS);

        startLabel = new Label("0");
        endLabel = new Label("31");
        GridPane.setHalignment(startLabel, HPos.LEFT);
        GridPane.setHalignment(endLabel, HPos.RIGHT);

        this.add(inputOutputPreviousButton, 0, 0, 1, 2);
        this.add(inputCellsContainer, 1, 0);
        this.add(outputCellsContainer, 1, 1);
        this.add(inputOutputNextButton, 2, 0, 1, 2);
        this.add(startLabel, 1, 2);
        this.add(endLabel, 1, 2);

    }

    public int getIndex() {
        return index;
    }

    private class InputOutputCell extends StackPane {

        @FXML
        Text text;
        @FXML
        Rectangle rectangle;

        public InputOutputCell(String text, Color color, int type) {

            setMinSize(0, 0);

            this.text = new Text(text);
            rectangle = new Rectangle();


            if (type == 0) {
                rectangle.widthProperty().bind(inputCellsContainer.widthProperty().divide(32));
                rectangle.heightProperty().bind(inputCellsContainer.widthProperty().divide(32));

            } else {

                rectangle.widthProperty().bind(outputCellsContainer.widthProperty().divide(32));
                rectangle.heightProperty().bind(outputCellsContainer.widthProperty().divide(32));

            }

            rectangle.maxWidth(Double.MAX_VALUE);
            rectangle.maxHeight(Double.MAX_VALUE);
            rectangle.setArcHeight(10);
            rectangle.setArcWidth(10);
            rectangle.setFill(color);
            rectangle.setStroke(Color.BLACK);

            getChildren().addAll(rectangle, this.text);

        }

        public void setText(String text) {
            this.text.setText(text);
        }

        public String getText() {
            return this.text.getText();
        }

    }

}

我希望单元格1,0和1,1可以调整大小,并且通过增加其宽度,可以清楚地看到第0行和第1行的高度不应该平均增加。如果还剩下任何高度,我希望第3行可以承受,因为第2行根本不应该增长到高度。

共有1个答案

郎泰平
2023-03-14

你做了相当多的解释(这很好),但它足够复杂,让我读了10遍,我想我理解了70%。最令人费解的是这句话:

剩余的可用空间应位于下面的另一行,以便根据该单元格内的元素保留该单元格的纵横比。

不确定您引用的是哪个“单元”,以及保持纵横比的含义。

现在对于实际答案,我认为我能看到的最明显的一个是您为VGrow赋予了第0行和第1行ALWAYS优先级。

您有3行始终具有VGrow,而网格窗格要做的是将所有子级分配给他们喜欢的任何空间,然后将所有“剩余”空间分配给始终具有的行。这就是为什么图像中的3个间隙具有相同的高度。

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

  • 问题内容: 我正在使用:https : //github.com/angular-ui/ui-grid.info/tree/gh- pages/release/3.0.0-RC.18 当我对值进行硬编码时,如上所示,网格扩展了,一切都按预期工作。 但是,如果我执行以下操作… 高度打印在div中,并且div变宽,但是内容本身仅扩大到340px左右。剩下的空间是空白的,所以我只看到8行,而不是25行。

  • DynamicHeights是一个动态表格元素高度(动态TableViewCell)的例子。实际应用场景在iOS开发中会经常遇到不规律的TableViewCell,往往需要根据内容的多少而动态调整这些Cell的大小。在http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ 中,有详细的解说开发的流程以及这么处理的原因。里面的大

  • 我正在JavaFx中开发一个应用程序,其中我有两个选项卡。 在第一个选项卡中,我有ComboBox: 在第二个选项卡中,我有这样的Gridpane: 我想要的是当用户从Tab A的组合框中选择3时,例如: 它应该在Tab B的Gridpane中添加3行,每列添加文本字段、复选框和datepicker。A列有文本字段,B列有复选框,C列有日期选择器,如下所示: 请帮助我如何才能实现这一点,实现后,我

  • 场景- > TableView高度是使用纵横比相对于superview的高度动态设置的。 TableViewCell的高度是根据表格视图的高度计算的: 问题 - 最初在委托方法中没有正确计算表格视图高度。但在滚动单元格后正确计算。 尝试的解决方案: 在视图中重新加载。 调用 在单元格中进行. 有什么方法可以正确计算出这个表格的高度吗?

  • 问题内容: 我希望TableView的高度适应填充的行数,以使其从不显示任何空行。换句话说,TableView的高度不应超过最后填充的行。我该怎么做呢? 问题答案: 如果您希望此操作有效,则必须设置。 然后,您可以将的高度与表格中包含的项目大小乘以固定单元格大小绑定在一起。 演示: 注意:我乘以fixedCellSize *(数据大小+ 1.01)以包含标题行。