13

質問はこれと重複しているように見えるかもしれませ。しかし、私の質問は、JavaFX で整数テキストフィールドを 2 つの方法で開発したことです。コードを以下に示します

public class FXNDigitsField extends TextField
{
private long m_digit;
public FXNDigitsField()
{
    super();
}
public FXNDigitsField(long number)
{
    super();
    this.m_digit = number;
    onInitialization();
}

private void onInitialization()
{
    setText(Long.toString(this.m_digit));
}

@Override
public void replaceText(int startIndex, int endIndex, String text)
{
    if (text.matches(Constants.DIGITS_PATTERN) || text.equals(Constants.EMPTY_STRING)) {
        super.replaceText(startIndex, endIndex, text);
    }
}

@Override
public void replaceSelection(String text)
{
    if (text.matches(Constants.DIGITS_PATTERN) || text.equals(Constants.EMPTY_STRING)) {
        super.replaceSelection(text);
    }
}
}

2 つ目の方法は、イベント フィルターを追加することです。

コードスニペットが提供されます。

 // restrict key input to numerals.
this.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() {
  @Override public void handle(KeyEvent keyEvent) {
    if (!"0123456789".contains(keyEvent.getCharacter())) {
      keyEvent.consume();
    }
  }
});

私の質問は、これを行う中傷的な方法はどれですか? 誰かが右を拾うのを手伝ってくれますか?

4

5 に答える 5

12

TextField に検証を追加する最良の方法は、3 番目の方法です。このメソッドにより、TextField はすべての処理を完了できます (コピー/貼り付け/元に戻すことができます)。TextField クラスを拡張する必要はありません。また、変更のたびに新しいテキストをどうするか (ロジックにプッシュするか、以前の値に戻すか、さらには変更するか) を決定できます。

// fired by every text property changes
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());
  }
);
于 2014-10-31T08:26:26.073 に答える
5

どちらの方法でも、数字以外の文字を入力することはできません。ただし、そこに任意の文字を貼り付けることができます (任意のソースからテキストをコピーし、TextField に貼り付けます)。

検証を行う良い方法は、送信した後です。

同様に (整数の場合):

try {
    Integer.parseInt(myNumField.getText());
} catch(Exception e) {
    System.out.println("Non-numeric character exist");
}

(または、あなたのものと上記の方法の任意の組み合わせを使用できます)

于 2013-05-24T04:44:48.917 に答える