2017-01-06 74 views
1

我需要限制的文本字段JavaFX的:文本字段最大值和最小值的聽衆

int maxLength = 64; 
    int minLength = 0; 
    txtSeuil.textProperty().addListener((v, oldValue, newValue) -> { 
     if (!newValue.matches("\\d*")) { 
      txtSeuil.setText(newValue.replaceAll("[^\\d*{1,2}]", "")); 
      if (txtSeuil.getText().length() > maxLength || txtSeuil.getText().length() < minLength) { 
       String s = txtSeuil.getText().substring(0, maxLength); 
       txtSeuil.setText(s); 
      } 
     } 

    }); 

領域也只接受數字,但任何數量的文本屬性的間隔,不只是間隔值

回答

1

如果我已經明白正確地說,你正試圖實現一個只允許區間[0,64]內的值的數字字段。根據this answerTextFormatter是完成此功能的推薦方式。看看這個MWE這應該解決您的問題:

public class RestrictedNumberFieldDemo extends Application { 

    public static void main(String[] args) { 
     launch(); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     TextField numField = new TextField(); 
     numField.setTextFormatter(new TextFormatter<Integer>(change -> { 
      // Deletion should always be possible. 
      if (change.isDeleted()) { 
       return change; 
      } 

      // How would the text look like after the change? 
      String txt = change.getControlNewText(); 

      // There shouldn't be leading zeros. 
      if (txt.matches("0\\d+")) { 
       return null; 
      } 

      // Try parsing and check if the result is in [0, 64]. 
      try { 
       int n = Integer.parseInt(txt); 
       return 0 <= n && n <= 64 ? change : null; 
      } catch (NumberFormatException e) { 
       return null; 
      } 
     })); 

     primaryStage.setScene(new Scene(numField)); 
     primaryStage.show(); 
    } 

} 
2

要解決您的問題,您可以爲TextFormatter實施自定義Filter。它只允許輸入數字並限制字符串的長度。下面是代碼片段展示瞭如何能工作:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextFormatter; 
import javafx.stage.Stage; 

public class Main5 extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     TextField textField = new TextField(); 
     textField.setTextFormatter(new TextFormatter<Integer>(change -> { 
      if (!change.getText().isEmpty()) { 
       return change.getText().matches("\\d+") && change.getControlNewText().length() <= 5 ? change : null; 
      } 

      return change; 
     })); 

     primaryStage.setScene(new Scene(textField)); 
     primaryStage.show(); 
    } 
} 
+0

感謝,它的工作原理的長度,但我對代碼犯了一個錯誤,我想是minvalue和包括maxValue不是爲長度值,但VOR的文本值,那麼我該如何解決這個問題? – devhicham

+0

@devhicham你是什麼意思的「文字值」?只有數字從0 - 64? – beatngu13

+0

@ beatngu13是的請,我希望該字段接受只有這個間隔數字從0到64 – devhicham

0

您的問題是:

長度檢查不這樣做,如果正則表達式匹配。但文字可以是一串數字要長。

你需要做相互獨立的檢查。

另外,您在某些情況下設置了一個新值,它會再次觸發相同的檢查。當然,他們會導致String被評估爲有效輸入,但你可以防止再次檢查通過引入在ChangeListener是存儲領域,無論是當前正在執行的監聽器:

txtSeuil.textProperty().addListener(new ChangeListener<String>() { 

    private boolean validating = false; 

    @Override 
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
     if (!validating) { 
      validating = true; 
      String newText = newValue; 
      boolean modify = false; 
      if (!newValue.matches("\\d*")) { 
       newText = newValue.replaceAll("[^\\d*{1,2}]", ""); 
       modify = true; 
      } 
      if (newText.length() > maxLength || newText.length() < minLength) { 
       newText = newText.substring(0, maxLength); 
       modify = true; 
      } 
      if (modify) { 
       txtSeuil.setText(newText); 
      } 
      validating = false; 
     } 
    } 
});