2013-05-14 101 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 
      } 

     });