当前位置: 首页 > 知识库问答 >
问题:

如何将事件处理程序与另一个方法调用连接起来?

单于善
2023-03-14

我在两个不同的类中有两个按钮,当按下第二个按钮时,我想将第一个按钮的onAction更改为原始操作加上一个额外的方法调用。一旦按下第一个按钮,我希望它的onAction恢复为原始。

我目前正在做的工作是非常紧张的

  Button b1 = new Button("b1");
    b1.setOnAction((event)-> {
        oldActionMethod();
    });

   public void oldActionMethod(){
     //actual code
   }
b2.setOnAction((event)-> {
      //some stuff
      Button b1 = getB1(); 
      EventHandler<ActionEvent> temp = b1.getOnAction();
      b1.setOnAction((event) -> {
        b1class.oldActionMethod(); 
        additionalMethod();
        b1.setOnAction(temp);
      }); 
    });

为了实现这一点,我必须将最初在setOnAction lambda表达式中的代码块移动到辅助函数中。有没有更干净的方法?这样就不需要helper函数了?

b1.setOnAction((event)-> {
    //actual code
});
b2.setOnAction((event) -> {
        //stuff 
        Button b1 = getB1();
        EventHandler<ActionEvent> temp = b1.getOnAction();
        b1.setOnAction(b1.getOnAction() + methodCall());
        b1.setOnAction(temp);
        //stuff
});

我目前使用的方法确实有效,但感觉真的很糟糕,所以我很想知道是否有更好的选择,可以将一个actionEvent与另一个方法连接起来。此外,如果有一种方法,不需要存储在临时对象的原始事件,并在结束时重置它。一个可能的解决方案是,如果我可以告诉b2在下一次b1被按下时侦听,但是我不知道当他们在两个不同的类中时是否有任何方法可以做到这一点。

共有1个答案

佴波鸿
2023-03-14

一种解决方案是在包含按钮的两个类之间有一个共享的模型类。< br >请参见下面的mcve。为了方便起见,可以将整个代码复制粘贴到一个文件(< code>FaMain.java)中,然后运行:

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FxMain extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        Model model = new Model();
        AClass aClass = new AClass(model);
        BClass bClass = new BClass(model);
        Label show = new Label();
        show.textProperty().bind(model.getTextProperty());
        VBox root = new VBox(10);
        root.getChildren().addAll(aClass.getButton(),show, bClass.getButton());
        primaryStage.setScene(new Scene(root, 400,100));
        primaryStage.sizeToScene();
        primaryStage.show();
    }

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

class Model {

    private final BooleanProperty aButtonSelected;
    private final SimpleStringProperty textProperty;

    Model(){
        aButtonSelected = new SimpleBooleanProperty();
        textProperty= new SimpleStringProperty();
    }

    ObservableValue<? extends String> getTextProperty() {
        return textProperty;
    }

    BooleanProperty aButtonSelectedProperty(){
        return aButtonSelected;
    }

    void bButtonClicked() {
        textProperty.set(aButtonSelected.get() ? "Button clicked. Toggle IS selected" :
            "Button clicked. Toggle is NOT selected");
    }
}

class AClass{

    private final ToggleButton aButton;

    AClass(Model model) {
        aButton = new ToggleButton("Toogle");
        model.aButtonSelectedProperty().bind(aButton.selectedProperty());
    }

    ToggleButton getButton(){
        return aButton;
    }
}

class BClass{

    private final Button bButton;

    BClass(Model model) {
        bButton = new Button("Click");
        bButton.setOnAction(e->model.bButtonClicked());
    }

    Button getButton(){
        return bButton;
    }
}
 类似资料:
  • 我已经创建了一个自定义钩子,它从服务器获取数据,向存储发送分派,并返回数据。如果我想在我的应用程序中列出所有评论,它是可用的,但是,我想在我需要获取所有评论回复的组件中重用它,而这应该只在单击某个按钮时发生。 这是下面的钩子。 在我的组件里面,我需要在点击按钮时获取回复 如果我把call放在处理程序中,我会得到一个错误,不能在那里调用hook,但是我只需要在单击按钮时调用它,所以我不知道是否有办法

  • 我需要从OracleIdtyManager中的自定义后处理事件处理程序调用外部REST API? 如果有人有想法,请在这里发布。

  • 问题内容: 我有一个包含一个按钮的标题组件,并且我希望该按钮在单击时显示另一个组件(模式页面)。 我可以做这样的事情: 这是我的标头组件: 这是我的模态页面组件,单击其他组件上的按钮时应显示该组件页面: 用于模态的库:https : //github.com/marcio/react-skylight 问题答案: 更像这样: 确保在子组件上公开一个方法: 基本上,这是在将SkyLight的方法包装

  • 我试图将ResNet中隐藏层的输出与另一个模型的输入连接起来,但出现以下错误: ValueError:模型的输出张量必须是Keras层的输出(因此保存过去的层元数据) 我正在使用Keras中的连接层,正如《如何连接Keras中的两个层?》中所建议的那样?,然而,它没有起作用。我可能会错过什么?我是否也必须添加一个致密层?想法是在第二个输入与第一个输入串联之前不要更改第二个输入(合并的输入将是第三个

  • 事件 事件,就是文档与浏览器发生特定的 交互瞬间。JavaScript与HTML之间的交互就是通过事件实现的。 事件流 所谓事件流,就是接收页面事件的顺序。 事件流分 事件冒泡流 与 事件捕获流。事件冒泡流是IE开发团队提出的,捕获流是Netscape开发团队提出的。 事件冒泡流 所谓事件冒泡,就是事件开始时由 最具体的元素(文档中嵌套最深的那个 节点)接收,然后逐级向上传播到较为不具体的节点(文

  • 我正在创建一个基本的GUI框架。框架有10个单选按钮和一个提交按钮。用户选择一个选项(JRadioButtons)并单击Submit(JButton)按钮。单击“提交”按钮时,用户选择的选项将显示在另一个框架上。 我希望提交按钮能识别用户选择的JRadioButton。我把我的代码放在这里供参考。 提前谢谢。