gpt4 book ai didi

java - 是否有 "best"方法从静态方法调用类方法?

转载 作者:行者123 更新时间:2023-11-29 04:47:26 25 4
gpt4 key购买 nike

我有多个 Controller ,每个都关联到不同的 FXML 文件。一个节点中有一个事件需要跨其他节点同步,所以我决定用另一个事件和各种 Controller 文件中的事件处理程序来做到这一点。

要注册事件处理程序,需要事件处理程序方法是静态的(即 addEventHandler(SomeEvent, ClassName::MethodName)

所以, Controller 看起来像...

public class MyController {
private static MyController selfRef = null;

public MyController() {
selfRef = this;
}

public static void someEventHandler(Event event) {
if (selfRef != null) {
selfRef.doSomethingUseful();
}
}

private void doSomethingUseful() { /* synch the nodes */ }
}

这行得通,但似乎有点乱七八糟。是否存在可实现相同最终结果的首选机制?

最佳答案

如果您摆脱所有静态内容并使事件处理程序成为您的 Controller 类的成员,您可能会更加灵活,如下所示。

没有静态成员的示例实现

import javafx.event.*;
import javafx.fxml.*;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.*;

import java.io.IOException;

class CustomerDialogController {
@FXML
private Label customerName;

private EventHandler<Event> customEventHandler = event -> {
// handle the event...
};

void initData(Customer customer) {
customerName.setText(customer.getName());
}

public EventHandler<Event> getCustomEventHandler() {
return customEventHandler;
}
}

public class EventHandling {
public Stage showCustomerDialog(Customer customer) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("customerDialog.fxml"));

Stage stage = new Stage(StageStyle.DECORATED);
stage.setScene(new Scene(loader.load()));

CustomerDialogController controller = loader.getController();
controller.initData(customer);

stage.addEventHandler(Event.ANY, controller.getCustomEventHandler());
stage.show();

return stage;
}
}

class Customer {
private String name;

Customer(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

关于实现选项的说明

在示例中,事件处理程序已添加到舞台,但它同样可以添加到任何场景或节点或任何具有处理事件能力的事物。

如果需要,您还可以为事件处理程序添加一个 setter ,以允许从外部更改事件处理逻辑。

除了上述设置之外,您可能希望让 Controller 在其初始化方法中自行注册事件处理程序。是否这样做取决于您是否希望能够注册暴露在 Controller 外部的事件处理程序,或者是否希望使用封装来隐藏 Controller 本地的所有事件处理逻辑。

关于(可能更好的)替代方案的说明

作为替代方法,您可以使用第三方系统,例如 Google Guava Event Bus,而不是将 JavaFX 中的事件处理系统用于您的自定义方法。 .

您还应该考虑为什么需要向您的应用程序添加自定义事件处理。 JavaFX 支持非常灵活的绑定(bind)和观察者模式。通过将模型对象的属性公开为可观察的,通常不需要自定义事件。通常,您的 View Controller 可以观察到关联模型对象的任何更改,并根据 UI 交互修改模型对象的内部状态。如果您引入一个基于依赖注入(inject)的系统来将模型注入(inject)到您的 Controller 中,例如 Guice、Spring、afterburner.fx,情况尤其如此。或 Gluon Ignite .

关于java - 是否有 "best"方法从静态方法调用类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com