2013-05-14 120 views
5

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

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); 
    } 
} 

回答

4

这是我的解决方案:

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?

+0

当心:在通知期间修改发件人的状态通常是一个糟糕的主意 - 你可能会难以跟踪的副作用 – kleopatra 2015-10-19 15:15:28

4

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主类是给你应该用你的LimitedTextField代替TextField

替换此行:

final TextField t_fname = new TextField(); 

这一个:

final LimitedTextField t_fname = new LimitedTextField(maxLength); 
+0

thanx Julien寻求帮助... – 2013-05-14 17:31:17

+1

它解决了您的问题吗? – 2013-05-14 19:03:13

+1

是的,它解决了...... :) – 2013-05-15 06:12:20

1

这与LimitedTextField非常相似,但我觉得它更整齐一些,因为验证是在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); 
} 
} 
+0

好为早期版本!自从8u40以来,我们在这个块上有了一个新的孩子 - TextFormatter。 – kleopatra 2015-10-19 15:18:31

5

虽然OP的技术问题是correctly answered(但不接受),解决基本问题 - 如何限制/在这是在其他职位回答了文本字段验证输入 - 随时间发生变化。

随着java8u40我们得到了一类新的TextFormatter:它的主要职责是提供一个钩到它被comitted的内容文本输入之前的任何变化。为了满足限制输入一定长度的要求(和 - 只是为了好玩 - 显示一个错误消息的上下文菜单),我们将

  • 实施,分析所有的变化
  • 拒绝那些将一个UnaryOperator导致进入一个较长的文本(和显示信息)
  • 接受所有其他的变化
  • 实例化的TextFormatter与运营商
  • 配置与的TextFormatter
的文本字段

的代码段:

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而它通知有关国家的改变它的听众通常是一个坏主意,可能很容易导致意外和难以跟踪副作用(我怀疑 - 虽然不知道 - 这在其他的答案中提到的撤销错误是这样的副作用)

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 
      } 

     }); 
相关问题