繁体   English   中英

如何处理JavaFX中另一个类的事件?

[英]How to handle an event from another class in JavaFX?

我正在尝试在Launcher类中创建一个按钮,并在另一个类中创建一个处理函数,如下所示。 但是,处理功能似乎不起作用。 什么都没打印。

我认为函数button.setOnAction(anotherclass)是原因。 在一些教程中,他们说setOnAction()的参数是我放置处理函数的位置。 所以我在那儿放了另一个课。

我知道我可以只在同一个类中创建一个处理函数,也可以只使用lambda。 但是,我试图看看这种方式是否有效。


public class Launcher extends Application{
    public static Button button;
    AnotherClass anotherclass;
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage myStage) throws Exception {
        button = new Button("Click me");
        button.setOnAction(anotherclass);

        StackPane layout = new StackPane();
        layout.getChildren().add(button);
        Scene scene = new Scene(layout, 300, 250);
        myStage.setScene(scene);
        myStage.show();

    }
}
public class AnotherClass implements EventHandler<ActionEvent>{
    @Override
    public void handle(ActionEvent event) {
        if(event.getSource()== Launcher.button) {   
            System.out.println("print");
        }
    }
}

谁能帮助我在不同于按钮的类中创建处理函数?

仅仅为了处理一个事件而创建一个完全不同的类,这将是一个非常奇怪的设计,但是可以做到。 只是不是您尝试这样做的方式。

如果您AnotherClass使用此单独的AnotherClass来处理它,则只需将带有new关键字的类传递给实例实例即可:

button.setOnAction(new AnotherClass());

但是,由于以下几个原因,这将是糟糕的设计:

  1. 您正在通过public修饰符公开Button 这是一个坏主意,并且违反了封装原理。
  2. 您将以一种非常不直观的方式将应用程序的逻辑与UI分开,从而使将来的维护更具​​挑战性。

我的建议是在setOnAction()方法中使用匿名类和lambda表达式:

button.setOnAction(event -> {
    System.out.println("print");
}

这将具有与您当前的AnotherClass实现相同的结果,但更易于阅读,更易于维护,将按钮的逻辑保持在同一代码中,并且不需要您公开公开Button

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM