在 Java/JavaFX 中处理这些事件的最佳方式

Best way to handle these events in Java/JavaFX

我不确定这是否合适,但我想保持我的代码干净,并决定创建不同的 类 来处理不同的事件。到目前为止,我只处理静态变量。现在我试图以相同的方式处理实例变量,但不确定我是否可以这样做。

有没有办法将 Rectangle 对象传递给我的 EventHandler,或者我应该在这种情况下只使用 Lambda 吗?

MainClass.java

//Static example
static TextField acTxt = new TextField();
...

acTxt.setText("Aircraft Number");
acTxt.setOnMouseReleased(new ClickAction());

...

//Instance Variable Example
public void printRec(){
    for(int i = 0; i < acArray.get(j).flight_array.size(); i++){
        Rectangle leg_rec = new Rectangle(i*10,i*10,10,15);
        leg_rec.setOnMouseClicked(new ClickAction());
    }
}

...

ClickAction.java Class

import static MainClass.acTxt;

    public class ClickAction implements EventHandler<Event>{

        @Override
        public void handle(Event event) {
            if(event.getSource().equals(acTxt)){
                acTxt.clear();
            }
    }

永远不要仅仅为了提供对它们的访问而将其设为静态。通过将字段设为静态,您可以完全改变其范围。除了常量字段,静态字段几乎总是一个糟糕的设计选择,如果您刚开始使用 Java,我的建议是避免将静态用于除 main 方法和真正常量之外的任何内容。

should I simply use [a] Lambda [expression]

你为什么不呢?就这样

acTxt.setOnMouseReleased(e -> acTxt.clear());

这不那么冗长,更容易阅读和理解(假设您熟悉 lambda 表达式,不需要太多练习)。实际行为是在定义控件的地方定义的,因此您不必深入研究其他 class 来发现松开鼠标时发生的情况。

Is there a way to pass the Rectangle object to my EventHandler

我猜你指的是这里的 TextField...?是的,当然:如果您真的想将事件处理程序定义为独立的 class,只需按照您的建议将文本字段传递给它即可....

public class ClickAction implements EventHandler<Event>{

    private final TextField textField ;

    public ClickAction(TextField textField) {
        this.textField = textField ;
    }

    @Override
    public void handle(Event event) {
        textField.clear();
    }

}

然后

acTxt.setText("Aircraft Number");
Rectangle leg_rect = ... ;
leg_rect.setOnMouseReleased(new ClickAction(acTxt));