Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用处理程序javafx限制textfield中的最大值_Java_Javafx_Textfield - Fatal编程技术网

如何使用处理程序javafx限制textfield中的最大值

如何使用处理程序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.

如何使用处理程序javafx限制textfield中的最大值

在我的文本字段中,我希望用户不要输入大于127的值

如何与处理程序一起执行该操作

我已经用regex将textfield限制为数值

如果有任何依据,您应该可以访问生成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,它会打印什么?我不理解绑定的部分。你能给我解释一下吗?