在 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));
我不确定这是否合适,但我想保持我的代码干净,并决定创建不同的 类 来处理不同的事件。到目前为止,我只处理静态变量。现在我试图以相同的方式处理实例变量,但不确定我是否可以这样做。
有没有办法将 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 myEventHandler
我猜你指的是这里的 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));