JavaFX:带有自动换行的 TextFlow 的最佳宽度

2023-12-28

With Textflow.setMaxWidth(double)我可以实现文字换行。

但我该如何调整宽度TextFlow之后以便它基于实际的包裹位置?

换句话说,如何让TextFlow边界捕捉到它的所有子级Text边界以消除右侧的空白区域:

**Edit**我在这个问题上取得了一些进展。我的课程源自TextFlow现在包含:

    double maxChildWidth = 0;
    for (Node child : getManagedChildren()) {
        double childWidth = child.getLayoutBounds().getWidth();
        maxChildWidth = Math.max(maxChildWidth, childWidth);
    }
    double insetWidth = getInsets().getLeft() + getInsets().getRight();
    double adjustedWidth = maxChildWidth + insetWidth;
    setMaxWidth(adjustedWidth);

不幸的是,这种方法似乎还不准确,因为在某些情况下它会导致第二次文本流更改。


您在问题中发布的解决方案似乎对我的测试工作正常。

在下图中,场景大小已调整以触发 TextFlow 的换行(以红色显示)。在右侧,TextFlow 并未完全在最后一个可见字符处换行,因为该行的最后一个字符是空格,因此换行发生在空格之后。考虑到 TextFlow 边界根据需要与所有文本齐平。

如果松开最大宽度,您将获得文本框的默认行为,即宽度增加(如下所示)。

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.*;
import javafx.stage.Stage;

public class TextFlowWrapper extends Application {

  @Override
  public void start(Stage stage) {
    TextFlow textFlow = new TextFlow(
      new Text(
        "Box with long description that should be wrapped"
      )
    ) {
      @Override
      protected void layoutChildren() {
        super.layoutChildren();

        double maxChildWidth = 0;
        for (Node child : getManagedChildren()) {
          double childWidth = child.getLayoutBounds().getWidth();
          maxChildWidth = Math.max(maxChildWidth, childWidth);
        }
        double insetWidth = getInsets().getLeft() + getInsets().getRight();
        double adjustedWidth = maxChildWidth + insetWidth;

        setMaxWidth(adjustedWidth);
      }
    };

    textFlow.setStyle("-fx-background-color: red");
    textFlow.setMaxWidth(Control.USE_PREF_SIZE);
    textFlow.setMaxHeight(Control.USE_PREF_SIZE);

    Button unclamp = new Button("Unclamp max width");
    unclamp.setOnAction(e -> textFlow.setMaxWidth(Double.MAX_VALUE));

    StackPane wrappedText = new StackPane(textFlow);

    VBox vbox = new VBox(
        unclamp,
        wrappedText
    );
    VBox.setVgrow(wrappedText, Priority.ALWAYS);

    Scene scene = new Scene(
        vbox
    );

    stage.setScene(scene);
    stage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }
}

该解决方案有点破解,您可能想向 JavaFX 开发人员询问一些有关该问题的意见openjfx 开发者列表 http://mail.openjdk.java.net/mailman/listinfo/openjfx-dev。也许一些额外的 api(例如布尔包属性)可以有条件地更新内部文本流布局算法以自动将文本流打包到最小大小,这将是更好的方法。部分困难在于,以易于理解的方式编写问题是一个困难的问题。也很难说这是否是某种极端情况,或者是否是更多人会遇到的情况(因此也许可以证明附加 API 的复杂性是合理的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX:带有自动换行的 TextFlow 的最佳宽度 的相关文章

  • RichTextFx CodeArea 中的文本背景颜色

    我正在使用 RichTextFx CodeArea 来突出显示我的代码 我想更改某些关键字的文本背景颜色并使用下面的 css parameter rtfx background color yellow But it s changes b
  • JavaFX 的 Swing 计时器替代方案以及线程管理差异

    使用 JavaFX 的 Swing 计时器是否安全 或者 Swing 有特殊的替代方案吗 JavaFX 和 Swing 的线程管理有什么区别 事实上我很想知道相当于摇摆计时器 SwingUtilities invokeLater and i
  • ARKit - 如何在另一个 SCNNode 中包含 SCNText(语音气泡)

    我正在尝试在 ARKit 的语音气泡中创建一个带有简单文本的报价生成器 我可以用文本显示语音气泡 但文本始终从中间开始并溢出到语音气泡之外 任何帮助使其在语音气泡的左上角对齐并包裹在语音气泡内的帮助将不胜感激 Result Classes
  • 确定 WPF 元素相对于某个父元素的边界矩形

    我认为这是一个非常简单的请求 但我似乎无法在搜索中找到确凿的答案 如何确定窗口中特定视觉元素相对于其他父元素的边界 我尝试过使用LayoutInformation GetLayoutSlot但这似乎只是返回一个Rect在 0 0 处并且不反
  • JavaFX-CSS:如何将父级的样式“移动”到子级?

    触发这个问题的是一个快速实验来解决TreeItem选择宽度 https stackoverflow com q 23792004 203657 要求仅突出显示文本 而不是整个树单元 没有比这更容易的了 弗雷德里克说 实现一个带有图形标签的自
  • 将两个表视图绑定在一起,以便它们同步滚动

    我想将两个表视图绑定在一起 以便它们同步滚动 我怎么做 我无法找到如何访问表格视图的滚动条 我做了一个CSS hack来将Tableview与外部滚动条绑定 一个滚动条控制两个表格视图 我的想法的概述 创建两个表视图 制作一个垂直滚动条 在
  • 向 Windows 任务栏缩略图添加按钮 JavaFX?

    这个问题已经闲置一年多了 我的问题仍然没有解决方案 我编辑此内容是为了澄清我的问题并引起人们对它的新关注 如果您使用 Windows 您可能知道将程序图标悬停在任务栏上时显示的小预览图像 缩略图 某些程序 例如 Spotify Git 扩展
  • 按下关闭按钮时 Java FX 中的关闭事件

    如果我直接按右上角的 X 按钮关闭窗口 Java FX 中是否存在任何事件处理程序 在这种情况下哪些事件会引起火灾 到目前为止 没有任何效果 setOnHiding 和 setOnCloseRequest 都不起作用 请帮忙 试试这个 im
  • FXML 文档拒绝导入其他 fxml 文件

    我的程序有一个主要的 FXML 文档 其中包含TabPane 对于每个选项卡 我希望它有自己的控制器和 fxml 文件 当我尝试将外部 fmxl 文件包含到主 fxml 文档中时 我的程序拒绝运行 这是我的主要 FXML 文档 这是我的 j
  • 如何使 AnchorPane 大小响应最大化的屏幕视图

    我不知道什么是灰色地带以及如何扩展我的Anchorpane到整个屏幕Image https i stack imgur com m5HqA png 不是未最大化的视图是这样的image2 https i stack imgur com 14
  • JavaFX TextField cancelEdit 未按预期工作

    I have a TextField https docs oracle com javase 8 javafx api javafx scene control TextField html and I would like the co
  • JavaFX中如何获取鼠标位置?

    我是java fx 的初学者 如何在 JavaFX 中获取鼠标在 x 和 y 中的位置 我尝试使用 AWTMouseInfo 也导入了它 但它不起作用 我还在 Ensembles 中看到了它的代码 在 高级阶段 拖动球窗口 这就是我需要做的
  • JavaFX - Outlook 附件 - DnD

    您好 我需要一个 DnD 解决方案来将 Outlook 邮件附件拖到堆栈窗格中 JavaFX Outlook 2010 stackpaneDragAndDropZone setOnDragOver DragEvent event gt Dr
  • 如何根据 JavaFX 8 中的特定祖先获取节点边界?

    我在 AnchorPane 中添加了一个图表 我想获取其绘图的范围 图表 我用青色标记 这样我就可以在它上面添加一些文本 但我应该根据它的祖先知道它的确切边界 如果我手动执行此操作 则在调整大小等时更改节点的填充大小时 我可能会失败 imp
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • 如何在场景生成器中设置控制器?

    我想用sceneBuilder for a javaFx应用 我有一个Package它被称作testPac其中有如图 1 所示的文件夹 我有一个fxml文件及其controller在 的里面view文件夹 现在 我不知道我必须在控制器盒内使
  • 不要包裹 span 元素

    我有一份清单 span 可以在 a 内左右移动的元素 div 元素 如果某些跨度超出了 div 它们应该被隐藏 这可以很好地使用overflow hidden 但是 如果跨度超出了 div 的容纳范围 跨度就会换行 这对于我的用例来说是不期
  • JavaFX ReadOnlyListProperty 不是只读的?

    这段代码抛出 UnsupportedOperationException 正如我所期望的那样 因为它是只读的 ListProperty
  • 使用多个值过滤 JFX TableView

    我目前正在尝试过滤我的数据TableView using FilteredList with predicate 我有2个ComboBoxes来过滤值 我的表包含Result Each Result has a Student that S

随机推荐