自动展开TextField以适合文本

Dia*_*ock 7 java javafx

我想创建一个文本字段,该字段在输入更多文本时会水平扩展。

prefColumnCount属性绑定到TextField中文本的长度后,其大小会随着文本的变长而增加。但是,无论文本长度如何,插入记号的位置都不会更新,并且会卡在同一位置。用户必须手动将插入号移动到前面,才能正确显示它。

图片:

输入一些文本后的样子,该文本不会占据整个文本字段:

在文本开头移动插入符号后:

这是我当前的代码:

TextField textField = new TextField();
textField.prefColumnCountProperty().bind(textField.textProperty().length());
setHgrow(textField, Priority.ALWAYS);
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?任何帮助表示赞赏!

000*_*laH 2

问题来自插入符号,它以图形方式更新其位置,就好像他位于静态区域中一样;一旦定义了 TextField 的prefWidth属性,插入符号就无法从文本字段中消失。

当我写下内容直到到达右侧时,插入符号应该超出该字段,这是不可能的;似乎是在虚拟墙前面。结果,所有文本内容都被“翻译”到左侧,以使插入符号位于同一位置。令人费解的是,您的绑定效果很好,因此TextField随着您添加文本, 的宽度继续增加......

就您而言,我建议您每次在文本字段中输入内容时刷新插入符号位置。将其添加EventHandler到您的TextField实例化中:

textField.addEventHandler(KeyEvent.KEY_PRESSED, ke -> {
    if (ke.getCode() != KeyCode.DELETE) {
        textField.positionCaret(0);
        textField.positionCaret(textField.getText().length());
    }
});
Run Code Online (Sandbox Code Playgroud)

附加说明

您的绑定仅适用于等宽字体,例如 Consolas 或 Courier New;prefWidth如果您使用 Arial 或 Calibri 等字体,将无法正确计算。您必须导入com.sun.javafx.tk和使用FontMetricsToolKit

您将拥有类似以下内容的内容,而不是绑定:

FontMetrics fm = Toolkit.getToolkit().getFontLoader().getFontMetrics(textField.getFont());
textField.textProperty().addListener((bean_p, old_p, new_p) -> {
    Insets in = textField.getInsets();
    textField.setPrefWidth(fm.computeStringWidth(new_p) + in.getLeft() + in.getRight());
});
Run Code Online (Sandbox Code Playgroud)

希望它对你有用:)