【问题标题】:Javafx adding ActionListener to buttonJavafx 将 ActionListener 添加到按钮
【发布时间】:2017-04-07 01:49:14
【问题描述】:
button.setOnAction(new EventHandler<ActionEvent>() {
    @Override public void handle(ActionEvent e) {
        label.setText("Accepted");
    }
});

在上面的代码中,我们定义了按下按钮时会发生什么。这一切都很好,但我想创建新的 ActionListener 然后将它添加到我的按钮。 通常在 JButton 中,我可以像这样添加 ActionListener:

button.addActionListener(someControllerClass.createButtonListener());

在上面的代码中,createButtonListener() 返回 ActionListener。

我的问题是:JButton addActionListener 的等价物是什么?

【问题讨论】:

    标签: java user-interface javafx actionlistener


    【解决方案1】:

    同样的方法,但使用 lamda 表达式更容易:

    buttonSave.setOnAction(event -> buttonSaveClicked());
    

    【讨论】:

      【解决方案2】:

      如果你想,例如重用EventHandler,将其定义为JavaFX Documentation 中所述:

      EventHandler<ActionEvent> buttonHandler = new EventHandler<ActionEvent>() {
          @Override
          public void handle(ActionEvent event) {
              label.setText("Accepted");
              event.consume();
          }
      };
      

      您现在可以通过以下方式将您定义的buttonHandler 添加到按钮的onAction

      button.setOnAction(buttonHandler);
      

      并引用提供删除选项的文档以确保完整性:

      要删除通过便捷方法注册的事件处理程序,请将 null 传递给便捷方法,例如,node1.setOnMouseDragged(null).

      为您带来:

      button.setOnAction(null)
      

      该文档还提供了一些示例,如何为特定事件添加处理程序 - 值得阅读。

      【讨论】:

      • 你的答案 SSchuette。如果我理解正确,你是说我应该使用 eventHandlers 而不是 actionListeners。我说的对吗?
      • 由于您似乎来自 Swing(您的 JButton 语句),因此您必须使术语与您的 UI 框架保持一致。编辑:看看stackoverflow.com/a/29785487/2061026
      • 是的,我只是在寻找 eventHandlers,它有点不同,但我解决了我的问题,感谢您的帮助。
      • 不用担心@MertG - 切换 UI 框架需要一些时间。特别是如果您不断混合 Swing、JavaFX、WPF 等。
      【解决方案3】:

      我认为这是我应该做的。创建处理程序:

      public EventHandler<Event> createSolButtonHandler()
      {
          btnSolHandler = new EventHandler<Event>() {
      
              @Override
              public void handle(Event event) {
                  System.out.println("Pressed!");
                  biddingHelperFrame.getBtnSag().setVisible(false);
              }
          };
          return btnSolHandler;
      }
      

      为按钮添加处理程序:

      btnSol.addEventHandler(MouseEvent.MOUSE_CLICKED, biddingHelperFrameController.createSolButtonHandler());
      

      【讨论】:

      • 为什么要提供一个方法(对于您明确声明的代码示例)返回一个新的 EventHandler 与我的答案中的方法相反?
      • @SSchuette 在您的回答中,您一次只能有一个事件处理程序。 OP 可能需要触发更多操作,因此他需要多个操作处理程序。
      • 是的,完全确认@GoXR3Plus,但这就是为什么被问到 - 所描述的场景对于单个处理程序来说似乎是“好的”。
      • 我只是根据您的建议 @SSchuette 发布我自己的问题的答案。它运行良好。
      • 通过这样的方法创建同一个EventHandler的多个实例没有任何意义。按照其他答案所示进行操作。
      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2016-12-15
      • 2016-01-12
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多