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

时间:2016-09-08 03:29:14

标签: java javafx event-handling instance-variables

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

有没有办法将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类

import static MainClass.acTxt;

    public class ClickAction implements EventHandler<Event>{

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

1 个答案:

答案 0 :(得分:1)

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

  

我应该简单地使用[a] Lambda [表达式]

为什么不是你?只是做

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

这不那么冗长,易于阅读和理解(假设您熟悉lambda表达式,并不需要太多练习)。实际行为是在定义控件的地方定义的,因此您不必在另一个类中挖掘以发现鼠标释放时会发生什么。

  

有没有办法将Rectangle对象传递给我的EventHandler

我认为你的意思是TextField ......?是的,当然:如果你真的想要将事件处理程序定义为一个独立的类,只需按照你的建议并将文本字段传递给它....

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));