如何使用JavaFX TextField maxlength
如何在我的JavaFX主类中使用此代码,以便在JavaFX如何使用JavaFX TextField maxlength,java,javafx-2,javafx,javafx-8,Java,Javafx 2,Javafx,Javafx 8,如何在我的JavaFX主类中使用此代码,以便在JavaFXTextField中设置字符的最大长度 class LimitedTextField extends TextField { private final int limit; public LimitedTextField(int limit) { this.limit = limit; } @Override public void replaceText(int start
TextField
中设置字符的最大长度
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主类如下所示:
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);
}
}
您应该使用
LimitedTextField
而不是TextField
替换此行:
final TextField t_fname = new TextField();
关于这一点:
final LimitedTextField t_fname = new LimitedTextField(maxLength);
这是我的解决方案:
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);
}
}
});
}
publicstaticvoidaddtextlimiter(finaltextfield,finalintmaxlength){
tf.textProperty().addListener(新的ChangeListener()){
@凌驾
public void changed(final observativevalue这与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);
}
}
导入java.awt.Toolkit;
导入javafx.scene.control.TextField;
公共类DataTextField扩展了TextField
{
整数长度;
整数比较;
公共数据文本字段(整数长度)
{
超级();
这个长度=长度;
}
公共void replaceText(int开始、int结束、字符串文本)
{
compare=getText().length()-(end-start)+text.length();
如果(比较而OP的技术问题是(尽管不被接受),基本问题的解决方案——如何限制/验证其他帖子中回答的文本字段中的输入——随着时间的推移而改变
有了java8u40,我们得到了一个新的类TextFormatter:它的主要职责之一是在文本输入被提交到内容之前提供一个钩子,用于插入文本输入的任何更改。为了满足将输入限制在一定长度的要求(并且为了好玩,显示带有错误消息的上下文菜单),我们需要
- 实现分析所有更改的一元运算符
- 拒绝那些可能导致较长文本的内容(并显示消息)
- 接受所有其他更改
- 使用运算符实例化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));
int len=20;
TextField=新的TextField(“最大字符数:+len”);
//在此,我们拒绝任何超出长度的更改
UnaryOperator rejectChange=c->{
//检查更改是否会影响验证谓词
if(c.isContentChange()){
//检查更改是否有效
如果(c.getControlNewText().length()>len){
//无效更改
//sugar:显示带有错误消息的上下文菜单
最终上下文菜单=新上下文菜单();
menu.getItems().add(新MenuItem(“此字段仅接受\n“+len+”个字符”);
menu.show(c.getControl(),Side.BOTTOM,0,0);
//返回null以拒绝更改
返回null;
}
}
//有效更改:通过返回更改来接受更改
返回c;
};
field.setTextFormatter(新的TextFormatter(rejectChange));
旁白:
当它通知其侦听器该状态的更改时,这通常是一个坏主意,并且可能很容易导致意外和难以跟踪的副作用(我怀疑——虽然不知道——其他答案中提到的撤销错误就是这样一种副作用)我的解决方案是限制文本字段的最大字符长度:
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
}
});
注意:在通知期间修改发送者的状态通常是一个坏主意-你可能很难跟踪副作用对于早期版本来说很好!自从8u40以来,我们在块文本格式化程序上有了一个新的孩子。