2

TextField で数値のみを許可したい TextField を検証しようとしています。私のコードは次のようになります。

public void handle(KeyEvent evt) {
    String character = evt.getCharacter();
    if(!character.equals("1")) {
        JOptionPane.showMessageDialog(null,evt.getCharacter());
        evt.consume();                
    }                                         
}

これはイベントを消費しません:(これはバグですか?これを行う別の方法はありますか?

4

3 に答える 3

4

これを試してみてください..

txtMobile.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) {
        String character=event.getCharacter();


        if(!valid.checkNumeric(character))
            event.consume();                    
    }});

そして数値の関数...

public boolean checkNumeric(String value)    {
    String number=value.replaceAll("\\s+","");
    for(int j = 0 ; j<number.length();j++){ 
            if(!(((int)number.charAt(j)>=47 && (int)number.charAt(j)<=57)))
            {
                return false;
            }
    }     
    return true;
}
于 2013-11-13T05:28:02.723 に答える
2

重要なイベントを消費することは、これに対する間違ったアプローチだと思います。入力をフィルタリングするためのほぼ間違いなく単純で侵襲性の低い方法は、textプロパティにリスナーをインストールし、必要に応じて元に戻すことです。

public class Test extends Application {
    @Override
    public void start(final Stage stage) throws Exception {
        final Pattern wholeNumberPattern = Pattern.compile("\\d*");
        final TextField tf = new TextField();
        tf.textProperty().addListener(new ChangeListener<String>() {
            public void changed(final ObservableValue<? extends String> observableValue, final String oldValue,
                                final String newValue) {
                if (!wholeNumberPattern.matcher(newValue).matches())
                    tf.setText(oldValue);
            }
        });
        stage.setScene(new Scene(tf));
        stage.show();
    }

    public static void main(String[] args) {
        System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());
        Application.launch(args);
    }
}
于 2013-03-17T13:17:55.420 に答える
2

JavaFX 8u40 以降、テキスト フィールドの入力を制限する最善の方法は、テキスト フィールドにTextFormatterを設定することです。詳細については、この回答を参照してください。イベント フィルタを追加したり、イベントを手動で消費したりする必要はありません。

于 2016-04-07T18:59:20.067 に答える