如何使用javafx textfield maxlength
如何在我的主类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); } }
这是我的解决方案:
public static void addTextLimiter(final TextField tf, final int maxLength) { tf.textProperty().addListener(new ChangeListener() { @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 maxlength和Prefer composition over inheritance?
虽然OP的技术问题得到了正确回答 (虽然不被接受),但基本问题的解决方案 – 如何限制/validationTextField中的输入(在其他post中得到回答)随着时间的推移而发生了变化。
使用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 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就是这样的副作用)
您应该使用您的LimitedTextField
而不是TextField
。
替换此行:
final TextField t_fname = new TextField();
与这一个:
final LimitedTextField t_fname = new LimitedTextField(maxLength);
这与LimitedTextField非常相似,但我觉得它更整洁,因为validation是在textinput之前完成的(而不是之后)。 此外,通过蜂鸣声和提示,用户得到一些反馈,输入是故意限制的。 当场失去焦点时,提示会关闭。
import java.awt.Toolkit; import javafx.scene.control.TextField; public class DataTextField extends TextField { int length; int compare; public DatenTextField(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); } }
我的解决方案是限制具有最大字符长度的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 } });