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

javafx:GridPane:在文本过长时防止列宽度增长

归鹤龄
2023-03-14

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

我有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但没有任何效果。任何建议如何修复它(我找不到例子或提示在万维网…)会很受欢迎的。

谢谢你,乔瑞斯

共有1个答案

蓬化
2023-03-14

我找到了一个部分的解决方法:

通过使用“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);
            }

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

任何帮助仍然欢迎!

 类似资料:
  • 我有一个灵活的布局,看起来像这样: 这很好,但是当产品描述很长时,我想隐藏溢出并显示省略号。 有一个类为的flex容器,它有两个flex子容器-(30%)和(70%)。右侧的

  • 问题内容: 我想在UILabel旁边显示图像,但是UILabel具有可变的文本长度,所以我不知道将图像放置在哪里。我该怎么做? 问题答案: -[NSString sizeWithFont:forWidth:lineBreakMode:]有什么用? 这个问题可能有您的答案,对我有用。 2014年,我根据下面的诺伯特的超方便评论编辑了这个新版本!这样就可以了。干杯

  • 我遇到的最后一个问题与这里的链接相同:flexbox项目的宽度被忽略 一切看起来都很好,但在最后一刻,我想更改flex容器的方向,所以我添加了

  • 对于我的基于TCP的网络应用程序,我使用基于长度的消息帧传输数据。很简单,一个数据包看起来是这样的: Length是一个Int32,告诉我即将到来的原始数据的长度。 用这个来防止磨炼,有什么好办法呢?我可以实现一个大小限制(例如,每个数据包1MB,任何高于这个值的东西都将丢弃客户机并阻止它),但是有没有更多的“标准”解决方案,不会让人觉得那么讨厌呢?

  • 我有一个小问题,试图保持我的.html页面在Chrome的宽度一致,例如,我有一个页面(1)有很多内容溢出了视口(对吗?)高度,所以在页面(1)上有一个垂直滚动条。在第(2)页,我有相同的布局(菜单,div等),但较少的内容,所以没有垂直滚动条在那里。 问题是,在第(1)页上,滚动条似乎将元素稍微向左推了一下(加总宽度?)而所有的一切都以第(2)页为中心 我仍然是HTML/CSS/JS的初学者,我

  • 我正在写一个小程序,可以处理大的(最多无限个)文本文件。处理过程将相当简单(将部分内容修剪并处理成单独的字符串,然后打印出来)。然而,由于数据的长度可能是无限的,我可能会遇到超过堆的问题。我想到的第一个解决方案是使用流来处理数据。然而,Files类中的lines()方法只能将文本分成行。我的线条也可以无限长! 我遇到的另一个解决方案是使用scanner useDelimiter方法: 这种方法会阻