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,或类似的东西。我也不知道语法的确切格式,即使 aTextInputBuilder是要创建的正确节点,所以如果你能告诉我调用应该采用的确切形式,那就太好了。

我猜是这样的:

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. 收到后在相应按钮上调用fire事件。
  3. 在通过调用 fire 处理事件后使用它,这样事件就不会被路由到按钮处理程序,从而导致事件可能被处理两次。

不要在已经为按钮定义的键事件处理程序中复制 ok/cancel 和对话框关闭的代码。

于 2012-09-27T23:12:54.610 回答