JavaFX动态网格面板行高度调整

时间:2017-02-16 23:49:17

标签: java javafx javafx-8

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

click for a pic

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 个答案:

答案 0 :(得分:0)

你做了相当多的解释(这很好),但它很复杂,足以让我阅读10次,而且我认为我理解了70%。最令人费解的是这一行:

  

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

不确定哪个&#34;小区&#34;你是指参考,以及你保持宽高比的意思。

现在对于实际答案,我认为我能看到的最明显的一点就是你为ALWAYS提供了0行和1 VGrow行的优先权。

你有3行ALWAYS VGrow,而GridPane将会做的是让所有孩子都有他们喜欢的空间,然后分发所有&# 34;剩余的&#34;空格到ALWAYS的行。这就是为什么图像中的3个间隙具有相同的高度。