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(使用前将#替换为@)