如何使用处理程序javafx限制textfield中的最大值
如何使用处理程序javafx限制textfield中的最大值 在我的文本字段中,我希望用户不要输入大于127的值 如何与处理程序一起执行该操作 我已经用regex将textfield限制为数值如果有任何依据,您应该可以访问生成KeyEvent的对象。如果我错了,请纠正我如何使用处理程序javafx限制textfield中的最大值,java,javafx,textfield,Java,Javafx,Textfield,如何使用处理程序javafx限制textfield中的最大值 在我的文本字段中,我希望用户不要输入大于127的值 如何与处理程序一起执行该操作 我已经用regex将textfield限制为数值如果有任何依据,您应该可以访问生成KeyEvent的对象。如果我错了,请纠正我 String str= new String(); int iCharacter; public void handle(KeyEvent keyEvent) { str+=keyEvent.
String str= new String();
int iCharacter;
public void handle(KeyEvent keyEvent) {
str+=keyEvent.getCharacter();
//should be able to get the object like txtField_fxid.getText();
String input = fxid.getString();
int value = Integer.parseInt( input );
if( value > 0 && value < 127 ){
// do stuff
}
}
我今天回家的时候会更新这个。
而不是使用事件处理程序,它允许用户输入无效的值,然后忽略或修复它们,考虑子类TeXField只允许有效的输入。< /P>
import java.util.concurrent.Callable;
import java.util.regex.Pattern;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.IndexRange;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class RestrictedTextFieldExample extends Application {
@Override
public void start(Stage primaryStage) {
final TextField restrictedTextField = new TextField() {
private final Pattern numberPattern = Pattern.compile("\\d{1,3}");
@Override
public void replaceText(int start, int end, String text) {
if (valid(start, end, text)) {
super.replaceText(start, end, text);
}
}
@Override
public void replaceSelection(String text) {
IndexRange selectionRange = getSelection();
if (valid(selectionRange.getStart(), selectionRange.getEnd(), text)) {
super.replaceSelection(text);
}
}
private boolean valid(int start, int end, String text) {
String attemptedText =
getText().substring(0, start)
+ text
+ getText().substring(end);
if (attemptedText.length() == 0) {
return true ;
}
if (numberPattern.matcher(attemptedText).matches()) {
int value = Integer.parseInt(attemptedText);
if (value >= 0 && value <= 127) {
return true ;
}
}
return false ;
}
};
IntegerProperty value = new SimpleIntegerProperty();
value.bind(Bindings.createIntegerBinding(new Callable<Integer>(){
@Override
public Integer call() throws Exception {
String text = restrictedTextField.getText();
if (text.isEmpty()) {
return 0 ;
} else {
return Integer.parseInt(text);
}
}
}, restrictedTextField.textProperty()));
value.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number oldValue, Number newValue) {
System.out.printf("Value changed from %d to %d%n", oldValue.intValue(), newValue.intValue());
}
});
VBox root = new VBox(5);
root.getChildren().add(restrictedTextField);
Scene scene = new Scene(root, 250, 150);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这遵循Richard Bair在中的示例,该方法允许TextField安全地完成所有复制/粘贴/撤消处理。 不要求进行扩展类。 并允许您在每次更改后决定如何处理新文本 将其推送到逻辑,或返回到以前的值,甚至修改它
// fired by every text property change
textField.textProperty().addListener(
(observable, oldValue, newValue) -> {
// Your validation rules, anything you like
// (! note 1 !) make sure that empty string (newValue.equals(""))
// or initial text is always valid
// to prevent inifinity cycle
// do whatever you want with newValue
// If newValue is not valid for your rules
((StringProperty)observable).setValue(oldValue);
// (! note 2 !) do not bind textProperty (textProperty().bind(someProperty))
// to anything in your code. TextProperty implementation
// of StringProperty in TextFieldControl
// will throw RuntimeException in this case on setValue(string) call.
// Or catch and handle this exception.
// If you want to change something in text
// When it is valid for you with some changes that can be automated.
// For example change it to upper case
((StringProperty)observable).setValue(newValue.toUpperCase());
}
);
对于您的情况,只需在内部添加此逻辑即可。工作完美
if (newValue.equals("")) return;
try {
Integer i = Integer.valueOf(newValue);
if (i >= 0 && i <= 127) {
// do what you want with this i
} else {
((StringProperty)observable).setValue(oldValue);
}
} catch (Exception e) {
((StringProperty)observable).setValue(oldValue);
}
在限制输入的代码中,我假设它是EventHandler或ActionListener,您可以尝试将输入强制转换为int,并以这种方式检查范围。确保也检查负数!没问题,您能在问题中发布一些更完整的代码片段吗?代码格式帮助:我可能要等到今晚晚些时候下班后才能发布答案。如何在答案中设置代码格式?好的,谢谢:您可以将所有代码行缩进四个空格,或者您可以选择一块代码,然后单击顶部小工具栏中类似于{}的按钮。您为什么使用fxid.getString?Eumh。。。同样的问题,因为如果用户使用DELETE键,字符串不会改变,value的值也会损坏。在JavaFX中有一种方法可以解释DELETE。在检查以确保没有空字符串时,只需删除尾随字符。然后我删除2。如果打印“str”,会发生什么?您可能没有正确处理删除操作(如果有的话)。请在上面的问题中发布更多的代码,这样我们就可以与所有ActionListener或EventHandlersHanks进行更多的合作!如果输入123,然后删除2,它会打印什么?我不理解绑定的部分。你能给我解释一下吗?