如何在JavaFX上使用setOnAction事件

nan*_*dor 1 javafx eventhandler

我想验证文本字段是否为空或不使用javafx。

我对事件处理程序感到困惑。我想确认一下:-是否有很多方法可以使用setOnAction:

submit.setOnAction((new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent event) { 
        System.out.println("Hello World"); 
     } 
    }));
Run Code Online (Sandbox Code Playgroud)

要么

submit.setOnAction(e -> handle(e));
Run Code Online (Sandbox Code Playgroud)

这两个选择有什么区别?

  • 第二个选择是否不能使用ActionEvent Submit.setOnAction(e-> handle()); 但是定义e的目的是什么?

我想验证我的应用程序中的文本字段。

public class AppGUI extends Application{

public static void main(String[] args)
{
    launch();
}


public void start(Stage topView)
{
    createUI(topView);
}

private void createUI(Stage topView)
{
    TextField name = TextField();
    Button submit = new Button("Submit");
    submit.setOnAction(e -> validate());
}
private boolean validate()
{
   // if textfield is empty, return false. else, return true. 
}
Run Code Online (Sandbox Code Playgroud)

我在这里迷路了。如果setOnAction中的e未在validate中使用,可以吗?如何将textfield的值传递给validate()?使文本字段私有变量是唯一的方法吗?(因为我有这么多文本字段,所以我想知道它是否是一个不错的选择)。在createUI方法中,我怎么说是否validate()返回false,显示错误消息,如果是,则执行其他操作?谢谢你,很抱歉打扰

ale*_*kyi 5

这两个选择有什么区别?

在第二个选项中,使用了lambda(自Java 8开始出现)

但是定义e的目的是什么?

对于按钮,您的方法具有这样的签名:setOnAction(EventHandler<ActionEvent> handler)您应该看到EventHandler教程ActionEvent javadoc。例如,从e可以以这种方式获取事件最初发生的对象e.getSource()

如果您在验证中不使用e也可以。

要传递textfield的值,您的方法应具有如下所示的签名

boolean validate(String text);
Run Code Online (Sandbox Code Playgroud)

代码示例:

private void createUI(Stage topView){
  TextField name = TextField();
  Button submit = new Button("Submit");

  submit.setOnAction(e -> {
      boolean validated = validate(name.getText());
      if(validated) System.out.println("validated"); 
  }
}

private boolean validate(String text){
  return text != null && !text.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)