【问题标题】:How to handle an event from another class in JavaFX?如何处理 JavaFX 中另一个类的事件?
【发布时间】:2019-04-22 03:16:46
【问题描述】:

我试图在 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,它是一个class。现在你在setOnAction 方法中设置null

标签: java button javafx event-handling


【解决方案1】:

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

如果你打算使用这个单独的AnotherClass 来处理它,你只需要传递带有new 关键字的类来实际实例化该类:

button.setOnAction(new AnotherClass());

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

  1. 您正在通过public 修饰符公开您的Button。这是一个坏主意,违反了封装原则。
  2. 您会以一种相当不直观的方式将应用程序的逻辑与 UI 分离,这使得将来维护起来更具挑战性。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多