Javafx:GridPane:防止列在文本太长时增大宽度

时间:2016-04-04 09:54:30

标签: java javafx javafx-8 gridpanel

我有一些遗留代码要修复,而且我正在努力解决以下问题:

我有2个嵌套的网格窗格。在内部网格内部,必须添加文本。

使用以下函数计算内网格和外网格的列宽相对于屏幕大小:

private GridPane createGridPane( int []colsPercent, int []rowsPercent ) {
    GridPane gridPane = new GridPane()
    // setup columns
    ColumnConstraints []colConst = new ColumnConstraints[colsPercent.length];
    for( int i = 0 ; i < colsPercent.length ; i++ ) {
        colConst[i] = new ColumnConstraints();
        colConst[i].setPercentWidth(colsPercent[i]);
        colConst[i].setFillWidth(true);
    }
    gridPane.getColumnConstraints().addAll(colConst);
    // setup rows
    RowConstraints []rowConst = new RowConstraints[rowsPercent.length];
    for( int i = 0 ; i < rowsPercent.length ; i++ ) {
        rowConst[i] = new RowConstraints();
        rowConst[i].setPercentHeight(rowsPercent[i]);
        rowConst[i].setFillHeight(true);
    }
    gridPane.getRowConstraints().addAll(rowConst);
    return gridPane;
}

网格及其内容通过以下代码添加:

   gridPane = createGridPane(colConstFeedbackScreenPercent,
                rowConstFeedbackScreenPercent);
        gridPane.setGridLinesVisible(true);
        GridPane.setHgrow(gridPane, Priority.NEVER);
        GridPane innerGridPane = createGridPane(colConstFeedbackInnerPercent,
                rowConstFeedbackInnerPercent);
        GridPane.setHgrow(innerGridPane, Priority.NEVER);
        innerGridPane.setGridLinesVisible(true);

        gridPane.add(innerGridPane, 1, 1);

如果我将文本添加到内部gridPane,就像这样:

VBox vBox = new VBox();

            vBox.setSpacing(25);
            {
                Text text = new Text(IRAPfx.getData().getOptionString("Localised text 6"));
                text.setFont(Font.font("Arial",FontPosture.ITALIC,FONT_SIZE_INSTRUCTIONS));

                text.setFill(Color.WHITE);

                GridPane.setHgrow(text, Priority.NEVER);
                vBox.getChildren().add(text);
            }

            ...

            GridPane.setHgrow(vBox, Priority.NEVER);
            innerGridPane.add(vBox, 1, 1 + resultsCell );

当文本字符串太大而无法放入其单元格时,内部网格与外部网格一起将生长,从而导致整个网格(内部和外部)被拉伸&#34 ;适合这个长内容,并在屏幕的右边缘运行。

我想要的是,长字符串在外部网格上运行,如果它很长,甚至在屏幕之外,但不会拉伸整个网格。

正如您在代码中看到的那样,我尝试将Hgrow设置为NEVER无济于事。任何建议如何解决它(我无法在www上找到示例或提示..)将非常受欢迎。

提前致谢, 里斯

3 个答案:

答案 0 :(得分:1)

您是否在Text对象上尝试过setWrappingWidth方法,您可以使用这种方式定义预定义,在这种情况下为200:

text.setWrappingWidth(200);

答案 1 :(得分:1)

我找到了部分解决方案:

您可以使用'label'代替'text'将文本剪辑或包装到单元格的可用宽度。见下文:

包装:

           {
                Label label = new Label(IRAPfx.getData().getOptionString("Localised text 6"));
                label.setFont(Font.font("Arial",FontPosture.ITALIC,FONT_SIZE_INSTRUCTIONS));
                label.setWrapText(true);
                label.setTextFill(Color.WHITE);
                vBox.getChildren().add(label);
            }

剪裁:

           {
                Label label = new Label(IRAPfx.getData().getOptionString("Localised text 6"));
                label.setFont(Font.font("Arial",FontPosture.ITALIC,FONT
                label.setTextOverrun(OverrunStyle.CLIP);
                label.setTextFill(Color.WHITE);
                vBox.getChildren().add(label);
            }

这或多或少解决了我的问题,但是我仍然无法让文本运行到下一列(放置文本/标签的单元格右侧的列)。

任何有关的帮助仍然欢迎!

答案 2 :(得分:0)

我不清楚为什么在将它们放入GridPane之前在VBox中包含Text元素。但你可以这样做:

    vbox.maxWidthProperty().bind(innerGridPane.widthProperty().multiply(innerGridPane.getColumnConstraints().get(1).percentWidthProperty());
    text.wrappingWidthProperty().bind(vbox.maxWidthProperty());

不幸的是,您不能只获取GridPane列并获取它的width属性来绑定它,因此您必须使用ColumnConstraints属性重新计算它。

如果您需要根据窗口大小等动态更改行为,则需要将相关属性绑定在一起。