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

JavaFX-8:限制文本字段中的字符数

容修贤
2023-03-14

我试图限制可以插入JavaFX-8文本字段的字符数:当达到限制时,调用endlinereach()方法。我想根据文本字段的大小(GUI上的可见部分)设置最大字符数。所以我使用的代码是

textfield.textProperty().addListener((ov, oldValue, newValue) -> {
            onEndLine(textfield.getText(), textfield.getPrefColumnCount());
        });


public void onEndLine(String text, int prefColumnCount) {
    if (text.length() > prefColumnCount) {
        endLineReached();
    }
}

问题是textfield.getPrefClonCount()无法正常工作。此外,我无法以编程方式设置prefClonCount值,因为每次重新启动程序(而不是在执行期间)时,文本字段的宽度都会发生变化。文本字段是JavaFX HBox的子字段。

共有1个答案

鲜于谦
2023-03-14

如果只想根据文本字段的视觉宽度来限制文本的长度,这有点棘手,因为它取决于许多因素(字体、文本字段的宽度、应用于文本字段的填充,在可变宽度字体的情况下,输入的实际文本等)。

注意,这似乎是一件奇怪的事情(imo),因为如果碰巧使用窄字符,用户将能够输入相对较长的文本,但如果碰巧使用宽字符,则可以输入相对较短的文本(在下面的示例中,我可以输入26“l”s,但只能输入8“m”)。实际上,允许用户输入的文本应该基于逻辑考虑(即业务规则),而不是视觉考虑。但也许你有一些不寻常的用例。

您可以在文本字段上使用文本格式化程序来否决添加文本。要检查宽度,请使用新文本创建一个新的Text对象,将字体设置为与文本字段相同的字体,然后检查其宽度。您还需要考虑文本字段中的填充。请注意,这有点脆弱,因为您并不真正了解文本字段布局的实现,但这似乎可以正常工作,至少在我拥有的JDK版本中是这样。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextInputControl;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class TextFieldNoScroll extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextField textField = new TextField();
        textField.setTextFormatter(new TextFormatter<String>(change -> {

            if (change.isAdded()) {
                Insets textFieldInsets = change.getControl().getPadding();              
                double horizPadding = textFieldInsets.getLeft() + textFieldInsets.getRight() ;

                Text newText = new Text(change.getControlNewText());
                newText.setFont(((TextInputControl)change.getControl()).getFont());
                double newTextWidth = newText.getBoundsInLocal().getWidth();
                if (newTextWidth + horizPadding > change.getControl().getWidth()) {
                    return null ;
                }
            }

            return change ;
        }));

        VBox root = new VBox(textField);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 120, 120);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 问题内容: 有没有一种方法可以将文本字段限制为仅允许数字0-100,从而排除字母,符号等?我已经找到了一种方法,但是它比看起来必要的方法复杂得多。 问题答案: 如果必须使用文本字段,则应将JFormattedTextField与NumberFormatter一起使用。您可以设置NumberFormatter上允许的最小值和最大值。 但是,Johannes建议使用JSpinner(如果适合您的用例)

  • 问题内容: 如何限制或限制用户在文本框中最多输入五个字符? 以下是我表单中的输入字段: 使用的是maxSize之类的东西吗? 问题答案: 最大长度: 输入将接受的最大字符数。这可以大于SIZE指定的大小,在这种情况下,该字段将适当滚动。默认值为无限制。 但是,这可能会或可能不会受到您的处理程序的影响。您可能还需要使用或添加另一个处理函数来测试长度。

  • 问题内容: 我正在使用mssql_fetch_object从MSSQL表中获取一些数据,但是文本似乎在页面上被截断了。 数据在表中全部存在,但似乎在视图页面中被切断了。 其他人是否遇到过此问题,也许知道解决方法?这是我的代码; 问题答案: 我不熟悉在php中使用mssql的情况,但是我只是尝试了使用mysql的示例而没有问题。 这对我来说可疑 VAR_DUMP()返回字符串(4096) 所以我做了

  • 我的代码中有JavaFX文本字段,希望在文本字段上为不同的事件添加一个操作。 今天,我只在文本字段中写入一些文本后按enter键时得到一个操作。如何添加处理tab press的操作?还有,当文本字段用鼠标点击失去焦点时,该如何反应? 当我读留档应该是可能的:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextFi

  • 在中设置货币小数格式时遇到问题。我用一个类来设置,这个类扩展了,它将转换为,反之亦然。当我应该更改值时,如果删除所有数据并插入一个新的完整值,它是有效的,但如果我必须添加/更改值的一部分,如13.10中的13.00,更改将不应用,并重新提出旧值13.00。 如何解决? 谢谢

  • 我在寻找一种方法来放弃我的程序中的一个getter。我有一堆动态创建的文本字段: 下面是getter,我想在这里返回聚焦的TextField 处理程序将接收聚焦字段并调用我的“model”-class中的checkInput()方法。 此刻,它接收到一个由我自己设置的预定义字段。检查答案的代码有效。感谢任何帮助我的人,如果我自己找到了一个方法,我一定会把它贴在这里。