gpt4 book ai didi

javafx-2 - 如何使 TextArea 拉伸(stretch)以填充内容,并在此过程中扩展父级?

转载 作者:行者123 更新时间:2023-12-02 21:12:17 28 4
gpt4 key购买 nike

所以我有一个 TextArea,当用户将段落粘贴到其中或只是在其中写入时,我希望它垂直展开以显示所有可用文本。 IE。不要在文本字段本身中使用滚动条...就像许多网页上发生的情况一样。许多用户,包括我自己,不喜欢被迫在小窗口中进行编辑。 Facebook 状态更新框的具体工作原理。

我已经尝试过

myTextArea.autoSize()

包裹在

myTextArea.textProperty().addListener(new ChangeListener()....);

但这不起作用。我认为它很高兴自动调整到当前大小。

左、右和顶部 anchor 设置为其父 AnchorPane。我试过底部连接和不连接的情况。理想情况下,我希望随着文本区域的增长而增长锚定 Pane 。

我不介意阅读 TextProperty 并计算我自己设置的触发器大小...但这似乎是一种黑客方法,如果已经有最佳实践。 javafx 的属性和子对象的数量足够令人畏惧,因此在这里提出问题似乎是一个好点,而不是试图弄清楚字体/段落等占用了多少像素。

更新:

所以我想也许我想得太多了,我所需要做的就是关闭滚动条,剩下的就会发生。唉,寻找“滚动”、“垂直”、“vbar”的可用字段和方法却找不到我能用的东西。 ScrollTopProperty 看起来像是有其他用途。

最佳答案

问题;当用户键入或复制粘贴更改文本时,需要增大或缩小 textArea 的高度。这是另一种方法:

public class TextAreaDemo extends Application {

private Text textHolder = new Text();
private double oldHeight = 0;

@Override
public void start(Stage primaryStage) {
final TextArea textArea = new TextArea();
textArea.setPrefSize(200, 40);
textArea.setWrapText(true);

textHolder.textProperty().bind(textArea.textProperty());
textHolder.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
@Override
public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) {
if (oldHeight != newValue.getHeight()) {
System.out.println("newValue = " + newValue.getHeight());
oldHeight = newValue.getHeight();
textArea.setPrefHeight(textHolder.getLayoutBounds().getHeight() + 20); // +20 is for paddings
}
}
});

Group root = new Group(textArea);
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();

// See the explanation below of the following line.
// textHolder.setWrappingWidth(textArea.getWidth() - 10); // -10 for left-right padding. Exact value can be obtained from caspian.css
}

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

但它有一个缺点;仅当多行之间存在换行符(即 Enter 键)时,文本区域的高度才会发生变化,如果用户键入的时间足够长,文本会换行为多行,但高度不会发生变化。

为了解决这个缺点,我添加了这一行

textHolder.setWrappingWidth(textArea.getWidth() - 10);

primaryStage.show();之后。它非常适合用户不换行的长打字。然而这又产生了另一个问题。当用户通过按“退格”删除文本时会出现此问题。当 textHolder 高度发生更改并且 textArea 的高度设置为新值时,就会出现该问题。 IMO,这可能是一个错误,没有更深入地观察。

在这两种情况下,复制粘贴都能正确处理。

关于javafx-2 - 如何使 TextArea 拉伸(stretch)以填充内容,并在此过程中扩展父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18588765/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com