我正在使用FXML來設置我的表單,但我需要設置文本字段中字符的限制。我怎麼能做到這一點?如何限制字符數量javafx textfield
6
A
回答
2
的下面是我的解決辦法來限制一個文本框的長度。 我不會推薦使用偵聽器(在文本屬性或長度屬性上)的解決方案,它們在所有情況下都不正確(就我所見)。 我創建了一個最大長度的HTML輸入文本,並將其與我在JavaFX中的文本字段進行比較。在這兩種情況下,我都有與粘貼操作(Ctrl + V),取消操作(Ctrl + Z)相同的行爲。這裏的目標是在修改文本字段之前檢查文本是否有效。 我們可以對數字文本字段使用類似的方法。
import java.util.Objects;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.control.TextField;
public class LimitedTextField extends TextField {
private final IntegerProperty maxLength;
public LimitedTextField() {
super();
this.maxLength = new SimpleIntegerProperty(-1);
}
public IntegerProperty maxLengthProperty() {
return this.maxLength;
}
public final Integer getMaxLength() {
return this.maxLength.getValue();
}
public final void setMaxLength(Integer maxLength) {
Objects.requireNonNull(maxLength, "Max length cannot be null, -1 for no limit");
this.maxLength.setValue(maxLength);
}
@Override
public void replaceText(int start, int end, String insertedText) {
if (this.getMaxLength() <= 0) {
// Default behavior, in case of no max length
super.replaceText(start, end, insertedText);
}
else {
// Get the text in the textfield, before the user enters something
String currentText = this.getText() == null ? "" : this.getText();
// Compute the text that should normally be in the textfield now
String finalText = currentText.substring(0, start) + insertedText + currentText.substring(end);
// If the max length is not excedeed
int numberOfexceedingCharacters = finalText.length() - this.getMaxLength();
if (numberOfexceedingCharacters <= 0) {
// Normal behavior
super.replaceText(start, end, insertedText);
}
else {
// Otherwise, cut the the text that was going to be inserted
String cutInsertedText = insertedText.substring(
0,
insertedText.length() - numberOfexceedingCharacters
);
// And replace this text
super.replaceText(start, end, cutInsertedText);
}
}
}
}
測試使用JavaFX 8和Java 8u45
8
您不能直接設置字符數限制。但是,你可以添加一個listener
到lengthProperty()
文本字段
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TextFieldLimit extends Application {
private static final int LIMIT = 10;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(final Stage primaryStage) {
final TextField textField = new TextField();
textField.lengthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number oldValue, Number newValue) {
if (newValue.intValue() > oldValue.intValue()) {
// Check if the new character is greater than LIMIT
if (textField.getText().length() >= LIMIT) {
// if it's 11th character then just setText to previous
// one
textField.setText(textField.getText().substring(0, LIMIT));
}
}
}
});
VBox vbox = new VBox(20);
vbox.getChildren().add(textField);
Scene scene = new Scene(vbox, 400, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
}
0
這是一個更好的辦法來完成這項工作的一個通用的文本字段:
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); } } }); }
完美的作品,除了那撤消錯誤。
1
這是一個非常簡單的解決方案,似乎爲我工作。
textfield.setOnKeyTyped(event ->{
int maxCharacters = 5;
if(tfInput.getText().length() > maxCharacters) event.consume();
});
0
我用一個簡單的調用ChangeListener,在那裏我測試條件來執行停止。
textFild.addListener((observable, oldValue, newValue) -> {
if (newValue.length() == MAX_SIZE) {
textField.setText(oldValue);
}
});
相關問題
- 1. 如何將數字傳遞給TextField JavaFX?
- 2. 限制LUIS字符數量?
- 3. JavaFX-8:文本字段中的字符數限制
- 4. Nativescript TextField文本/數量限制
- 5. 限制Textfield只能輸入數字
- 6. 在TextField中格式化字符串JavaFX
- 7. JavaFX,TextField值到變量
- 8. 如何使用javafx textfield maxlength
- 9. 如何限制iPhone上textfield中文本/數字的長度?
- 10. 如何覆蓋批量變量的字符數限制?
- 11. 如何在另一個JavaFX控制器中設置字符串或文本在JavaFX TextField控制器
- 12. 如何限制字符串中的字母數量
- 13. 如何用css限制按行或字符數限制字符數?
- 14. 限制Google recaptcha字符的數量
- 15. 限制附加字符串的數量
- 16. 如何限制objective-c中的數字和特殊字符
- 17. 字符串變量字符限制
- 18. 如何限制輸入的字符數
- 19. 如何限制@ Html.TextArea中的字符數?
- 20. jQuery:如何限制字符數?
- 21. UITextField限制字符的數量和類型
- 22. 限制用戶在javafx中輸入最多3個字符
- 23. 如何在JavaFX中將「粘貼」動作限制爲特定的TextField?
- 24. JavaFX TextField驗證
- 25. JavaFX 2.2 TextField maxlength
- 26. JavaFX TextField EventHandler
- 27. 如何使用javascript限制括號內的字符數量
- 28. 如何鎖定鍵盤來限制textarea中的字符數量?
- 29. 如何限制打印字符串的數量?
- 30. 如何限制用戶可以輸入的字符數量?
我建議'textField.setText(textField.getText()子串(0,LIMIT)。);'。否則,如果用戶使用複製並粘貼來轉儲非常大的字符串,它會反覆調用偵聽器,一次減少文本中的一個字符。 –
謝謝指出!我編輯了答案! – ItachiUchiha
太好了。非常感謝。 –