如何使用javafx textfield maxlength

java javafx-2 javafx javafx-8

8099 观看

5回复

1021 作者的声誉

如何在我的主类javafx中使用此代码。这样我就可以在javafx texfield中设置字符的最大长度。

class LimitedTextField extends TextField {

    private final int limit;

    public LimitedTextField(int limit) {
        this.limit = limit;
    }

    @Override
    public void replaceText(int start, int end, String text) {
        super.replaceText(start, end, text);
        verify();
    }

    @Override
    public void replaceSelection(String text) {
        super.replaceSelection(text);
        verify();
    }

    private void verify() {
        if (getText().length() > limit) {
            setText(getText().substring(0, limit));
        }

    }
};

我的java fx主类如下所示

public class TextFiled extends Application {
        @Override
    public void start(Stage primaryStage) {

           final TextField t_fname = new TextField();


        StackPane root = new StackPane();
        root.getChildren().add(t_fname);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
作者: java baba 的来源 发布者: 2013 年 5 月 14 日

回应 (5)


4

737 作者的声誉

你应该用你的LimitedTextField而不是TextField

替换此行:

final TextField t_fname = new TextField();

这一个:

final LimitedTextField t_fname = new LimitedTextField(maxLength);
作者: Julien Bodin 发布者: 14.05.2013 09:00

4

3991 作者的声誉

决定

这是我的解决方案:

public static void addTextLimiter(final TextField tf, final int maxLength) {
    tf.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {
            if (tf.getText().length() > maxLength) {
                String s = tf.getText().substring(0, maxLength);
                tf.setText(s);
            }
        }
    });
}

请参阅JavaFX 2.2 TextField maxlengthPrefer composition over inheritance?

作者: ceklock 发布者: 04.03.2014 03:36

1

63 作者的声誉

这与LimitedTextField非常相似,但我觉得它更整洁,因为验证是在textinput之前完成的(而不是之后)。此外,通过蜂鸣声和提示,用户得到一些反馈,输入是故意限制的。当场失去焦点时,提示会关闭。

import java.awt.Toolkit;
import javafx.scene.control.TextField;

public class DataTextField extends TextField
{
int length;
int compare;

public DataTextField(int length)
{
    super();
    this.length = length;
}

public void replaceText(int start, int end, String text)
{
    compare = getText().length() - (end - start) + text.length();
    if( compare <= length || start != end)
    {
        super.replaceText( start, end, text );
    }
    else
    {
        Toolkit.getDefaultToolkit().beep();
        show();
    }
}

public void replaceSelection(String text)
{
    compare = getText().length() + text.length();
    if( compare <= length )
    {
        super.replaceSelection( text );
    }
    else
    {
        Toolkit.getDefaultToolkit().beep();
        show();
    }
}
private void show()
{
    final ContextMenu menu = new ContextMenu();
    menu.getItems().add(new MenuItem("This field takes\n"+length+" characters only."));
    menu.show(this, Side.BOTTOM, 0, 0);
}
}
作者: gute Fee 发布者: 17.10.2015 09:35

7

45739 作者的声誉

虽然OP的技术问题得到了正确回答(虽然不被接受),但基本问题的解决方案 - 如何限制/验证TextField中的输入(在其他帖子中得到回答)随着时间的推移而发生了变化。

使用java8u40,我们得到了一个新类TextFormatter:它的主要职责之一是在文本输入被调用到内容之前提供一个钩子。为了满足将输入限制到一定长度的要求(并且 - 只是为了好玩 - 显示带有错误消息的上下文菜单),我们会

  • 实现分析所有更改的UnaryOperator
  • 拒绝那些会导致更长文本的内容(并显示消息)
  • 接受所有其他更改
  • 使用运算符实例化TextFormatter
  • 使用TextFormatter配置TextField

代码段:

int len = 20;
TextField field = new TextField("max chars: " + len );
// here we reject any change which exceeds the length 
UnaryOperator<Change> rejectChange = c -> {
    // check if the change might effect the validating predicate
    if (c.isContentChange()) {
        // check if change is valid
        if (c.getControlNewText().length() > len) {
            // invalid change
            // sugar: show a context menu with error message
            final ContextMenu menu = new ContextMenu();
            menu.getItems().add(new MenuItem("This field takes\n"+len+" characters only."));
            menu.show(c.getControl(), Side.BOTTOM, 0, 0);
            // return null to reject the change
            return null;
        }
    }
    // valid change: accept the change by returning it
    return c;
};
field.setTextFormatter(new TextFormatter(rejectChange));

在旁边:

通知听众关于该状态的改变时修改发送者的状态通常是一个坏主意,并且可能容易导致意外和难以跟踪的副作用(我怀疑 - 虽然不知道 -其他答案中提到的撤消bug就是这样的副作用)

作者: kleopatra 发布者: 19.10.2015 03:12

0

471 作者的声誉

我的解决方案是限制TextField最大字符长度:

        final int maxLength = 20;

        textField.setOnKeyTyped(t -> {

            if (textField.getText().length() > maxLength) {
                int pos = textField.getCaretPosition();
                textField.setText(textField.getText(0, maxLength));
                textField.positionCaret(pos); //To reposition caret since setText sets it at the beginning by default
            }

        });
作者: jbilander 发布者: 31.10.2017 12:20
32x32