0

いくつかのボタンとともに、AnchorPane に TextField が埋め込まれています。TextField にはデフォルトでフォーカスがありません。これは、プロンプト テキストを表示するためです ( javafx 2 のテキスト フィールドのプロンプトテキストは、Java 7 の更新後にフォーカスを非表示にします- これは既知の問題のようです)。ユーザーが ENTER または ESCAPE 以外のキーを押したときに、TextField がフォーカスを受け取るようにします。AnchorPane.setOnKeyPressed() (およびボタンの onKeyPressed リスナー) にアタッチされた EventHandler を作成しました。これは、キーボード イベントでスイッチを実行し、デフォルトで次のようになります。

                    default:
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            myTxt.requestFocus();
                            myTxt.fireEvent(event);
                        }
                    });

これにより、フォーカスが TextField に送信されます。ただし、押したキーは実際には TextField に表示されません。つまり、入力すると

test

TextField はフォーカスを受け取りますが、

est

フィールドに現れます。アンカーペイン/ボタンと TextField の両方の KeyEvent リスナーにロギングを追加しました。

Oct 29, 2013 2:22:11 PM com.myapp.AppMainController$4 handle
INFO: Got key t at source Button[id=myBtn, styleClass=button]
Oct 29, 2013 2:22:11 PM com.myapp.AppMainController$6 handle
INFO: Got key t at source TextField[id=myTxt, styleClass=text-input text-field]

したがって、重要なイベントは TextField に到達することですが、ボックスには表示されません。入力を続けると、残りのテキストが表示されます。大文字の T に対して SHIFT-T のような組み合わせを入力してフォーカスを得ると、表示されます (Shift キーの押下が「失われた」ものであるようです)。手紙自体の代わりに)。

他の誰かがこれに遭遇しましたか?これはJavaFX2のバグですか、それとも何か間違っていますか? 参考までに、JavaFX 2.2.45 が含まれている Java 7u45 を使用しています。

編集 1: フォーカスがペインまたはボタンから切り替えられたかどうかに関係なく、フォーカスを TextField に切り替えたときにこれが発生することを明確にする必要があります。

編集2(解決策): 実際の問題は「Platform.runLater」ラッパーでした。「runLater」を使用せずにフォーカスをリクエストすると、キー イベントが期待どおりに表示されます。

                    default:
                        myTxt.requestFocus();
4

1 に答える 1

1

あなたのコンテキストがどのように見えるかはわかりませんが、このように解決しました

public class Main extends Application {
    @Override
    public void start(Stage stage) {        
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));

        final TextField textField = new TextField();
        final Button button = new Button();

        vbox.getChildren().addAll(textField, button);


        vbox.onKeyPressedProperty().set(new EventHandler<KeyEvent>() {
            @Override public void handle(KeyEvent event) {
                textField.requestFocus();
            }
        });

        stage.setScene(new Scene(vbox, 300, 500));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

重要な部分は

vbox.onKeyPressedProperty().set(new EventHandler<KeyEvent>() {
    @Override public void handle(KeyEvent event) {
        textField.requestFocus();
    }
});

keyPressedProperty を使用することで、任意のボタンを押したときにアクティブになり、タイプしたり離したりしたときではなくなります。大文字と非大文字で動作します。

編集

ボタンは、TextField の非フォーカスを「テスト」できるように挿入され、クリックしてフォーカスを与えることができます。

編集 2

実際の回答と一致させるには、複数のケースで実際に必要な Platform.runLater を使用していくつかの回避策を使用します。これは IntegerField (TextField を拡張) 内のコードなので、独自のメソッドです。

this.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent paramT) {
        Platform.runLater(new Runnable() {
            @Override public void run() {
                if (isFocused() && !getText().isEmpty()) {
                    selectAll();
                }               
            }
        });
    }
});
于 2013-10-31T16:55:47.483 に答える