Javafx:GridPane:当文本太长时防止列增加宽度

Posted

技术标签:

【中文标题】Javafx:GridPane:当文本太长时防止列增加宽度【英文标题】:Javafx: GridPane: Prevent column to grow width when text is too long 【发布时间】:2016-04-04 09:54:29 【问题描述】:

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

我有 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 );

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

我想要归档的是,长字符串会越过外部网格,如果它真的很长,甚至会超出屏幕,但不会拉伸整个网格。

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

提前致谢, 乔里斯

【问题讨论】:

【参考方案1】:

我找到了部分解决方案:

您可以使用“标签”而不是“文本”将文本剪切或换行到单元格的可用宽度。见下文:

用于包装:

           
                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】:

你试过Text对象的setWrappingWidth方法吗,你可以用这种方式定义一个预定义的,在这种情况下是200:

text.setWrappingWidth(200);

【讨论】:

谢谢 Rene,我以前尝试过这种方法,它有效。但是,它没有考虑可用的不同屏幕宽度。我通过使用“标签”而不是“文本”找到了自己的解决方案。我将在下面发布解决方案【参考方案3】:

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

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

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

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

【讨论】:

以上是关于Javafx:GridPane:当文本太长时防止列增加宽度的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaFX GridPane 的列之间设置填充?

如何使用 GridPane JavaFX 使按钮跨越多个列/行?

JavaFX:GridPane 中的 ComboBox 导致不必要的大小调整

JavaFX:如何从 GridPane 中动态创建的文本字段的值计算平均值?

在GridPane JAVAFX中水平居中一行

如何在 JavaFX 的 GridPane 中删除“幽灵线”?