首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用JavaFX TextField maxlength

如何使用JavaFX TextField maxlength
EN

Stack Overflow用户
提问于 2013-05-14 16:53:12
回答 5查看 11.2K关注 0票数 5

如何在我的JavaFX主类中使用此代码,以便在JavaFX TextField中设置最大字符长度

代码语言:javascript
运行
复制
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));
        }

    }
};

我的JavaFX主类如下所示:

代码语言:javascript
运行
复制
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);
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-04 23:36:23

这是我的解决方案:

代码语言:javascript
运行
复制
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?

票数 7
EN

Stack Overflow用户

发布于 2015-10-19 23:12:19

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

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

使用operator

  • configure

  • 实现一个分析所有更改的UnaryOperator,并拒绝那些会导致文本变得更长的更改(并使用TextFormatter

changes

  • instantiate TextFormatter TextField显示所有其他更改

代码片段:

代码语言:javascript
运行
复制
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));

旁白:

Modifying the state of a sender在通知监听器状态改变时,通常不是一个好主意,而且很容易导致意想不到的、难以跟踪的副作用(我怀疑--尽管我不知道--其他答案中提到的撤销bug就是这样的副作用)

票数 8
EN

Stack Overflow用户

发布于 2013-05-14 17:00:10

您应该使用LimitedTextField而不是TextField

替换此行:

代码语言:javascript
运行
复制
final TextField t_fname = new TextField();

使用这一条:

代码语言:javascript
运行
复制
final LimitedTextField t_fname = new LimitedTextField(maxLength);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16538849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档