0

<Enter>ダイアログでdefaultButtonを受け入れ<ESC>、cancelButtonを実行しようとしています。

次のようなコードがあります。

dialog1 = new Stage(StageStyle.UNDECORATED);
dialog1.initModality(Modality.WINDOW_MODAL);
dialog1.initOwner(primaryStage);
dialog1.setScene(
  new Scene(
    HBoxBuilder.create().styleClass("modal-dialog").children(
      LabelBuilder.create().text("Tells user what to do...").build(),
      ButtonBuilder.create().text("Next step").defaultButton(true).onAction(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent actionEvent) {
          // take action and close the dialog1.
          // do "OK" actions here...
          dialog1.close();
        }
      }).build(),
      ButtonBuilder.create().text("Cancel").cancelButton(true).onAction(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent actionEvent) {
          // abort action and close dialog1.
          // do "CANCEL" actions here...
          dialog1.close();
        }
      }).build()
    ).build()
    , Color.TRANSPARENT
  )
);
dialog1.getScene().getStylesheets().add(getClass().getResource("ModalDialog.css").toExternalForm());

そして、キーボードを処理するために以下のようなものを追加したいと思います。このような単純なことは可能ですか?

.onAction(new EventHandler<KeyEvent>() {
  @Override public void handle(KeyEvent t) {
    if (t.getCode() == KeyCode.ENTER) {
      // do "OK" actions here
      dialog1.close();                    
    } else {
      // do "CANCEL" actions here
      dialog1.close();                    
    }
  }
}).build()        

私の問題は、このハンドラーをハングアップする「ノード」を探しましたが、見つからないようです。のようTextInputBuilderに、またはそのようなもの。また、作成するノードがa であったとしても、構文の正確な形式もわかりません。そのTextInputBuilderため、呼び出しがとるべき正確な形式を教えていただければ、それは素晴らしいことです。

私は次のようなものを推測しています:

dialog1.setScene(
  new Scene(
    HBoxBuilder.create().styleClass("modal-dialog").children(
      TextInputFieldBuilder.onAction(new EventHandler<KeyEvent>() {
        @Override public void handle(KeyEvent t) {
          if (t.getCode() == KeyCode.ENTER) {
            // do "OK" actions here
            dialog1.close();                    
          } else {
            // do "CANCEL" actions here
            dialog1.close();                    
          }
        }
      }).build(),
      LabelBuilder.create().text("Tells user what to do...").build(),
      // [ ... ]
4

1 に答える 1

1

<Enter>ダイアログでdefaultButtonを受け入れ<ESC>、cancelButtonを実行しようとしています。

これはdefaultButtoncancelButtonのデフォルトの動作であるため、通常、これを行うために追加のコードは必要ありません。


万一、シーン内の他のコントロールが消費または押下しており、それをオーバーライドしたい場合:

  1. シーンにフィルターを追加して、関連するKeyEventをトラップします。
  2. 受信時に、対応するボタンで発火イベントを呼び出します。
  3. イベントがボタン ハンドラーにルーティングされて、イベントが 2 回処理される可能性がないように、fire を呼び出してイベントを処理した後にイベントを消費します。

ボタンに対して既に定義されているキー イベント ハンドラーで、ok/cancel およびダイアログを閉じるためのコードを複製しないでください。

于 2012-09-27T23:12:54.610 に答える