繁体   English   中英

如何从javafx中的事件处理程序返回结果?

[英]How to return result from event handler in javafx?

如何从javafx中的事件处理程序返回结果? 我有下面的代码,如何从事件返回数据到函数showPrompt? 是否可以为事件的功能恢复数据?

public static String showPrompt(String title, String defValue){
          final Stage dlgStage = new Stage();
          TextField txtPromptValue = new TextField(defValue);

          Button btnOk = new Button("Ok");
          Button btnCancel = new Button("Cancel");
          btnOk.setOnAction(new EventHandler<ActionEvent>(){
              @Override
              public void handle(ActionEvent arg0) {
                  //How to return data from event to function?
                  dlgStage.close();
              }
          });
          btnCancel.setOnAction(new EventHandler<ActionEvent>(){
              @Override
              public void handle(ActionEvent arg0) { 
                  //How to return data from event to function?
                  dlgStage.close();
              }
          });
          //
          Label lblTitle = new Label(title);
          lblTitle.setFont(Font.font("Amble CN", FontWeight.NORMAL, 14));
          //
          VBox vbox = new VBox(lblTitle,txtPromptValue,btnOk,btnCancel);
          vbox.setAlignment(Pos.CENTER);
          vbox.setMinSize(300, 200);
          //
          Scene dlgScene = new Scene(vbox);
          //
          dlgStage.setScene(dlgScene);
          dlgStage.initStyle(StageStyle.UNDECORATED);
          dlgStage.initModality(Modality.APPLICATION_MODAL);
          dlgStage.setMinWidth(300);
          dlgStage.setMinHeight(200);
          dlgStage.show();       

}

简短的答案是您无法返回值。

为什么呢

下面的代码称为callback

new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent arg0) {
        dlgStage.close();
    }
}

回调没有返回类型,如您在上面的示例中看到的那样,它是void

回调是方法 ,您作为参数传递给另一个方法。 另一个方法会在需要时调用回调方法 这意味着回调是异步的。
在您的示例中,当您按下按钮时,它将调用回调

总之,您不能使用return从中return

该怎么办 ?

您可以从回调中调用方法,并将return值作为参数发送给该方法。

例:

btnCancel.setOnAction(
   new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent arg0) {
            YourClass.setReturnValue("This is button Cancel");
            dlgStage.close();
        }
    }
});

setReturnValue是属于YourClass的方法或其实例,因此它将零售您的返回值。

更好的方法的另一种方式是创建可能扩展Stage的类。 同样在showPrompt方法中,您将必须使用showAndWait()或类似方法阻止执行。

总之,您不能仅通过一种方法来创建整个Prompt

不能这样做 ,因为在打开和关闭提示阶段之前,主线程已经通过了showPrompt方法。

正如安德烈说 ,你需要做的就是创建自己的自定义PromptStageshowPrompt API,阻止主线程,直到提示阶段被关闭。

public static String showPrompt(final String title, final String defValue)
{
    // This line will block the main thread
    // See the "showAndWait()" API from JavaFX
    final boolean result = PromptStage.showPrompt("My Prompt Stage", " ");

    // And when the stage is closed, it will carry on to this piece of code
    if (result) 
    {
         return "This is button OK";
    }
    else
    {
         return "This is button CANCEL";
    }
}

或者,如果您愿意,甚至可以创建PromptDialog实例

public static String showPrompt(final String title, final String defValue)
{
    final PromptStage pStage = new PromptStage();

    // This line will block the main thread
    // See the "showAndWait()" API from JavaFX        
    pStage.showAndWait();

    return pStage.getResultAsString();
}

这里有很多方法。 老实说,我不会为您写整个课程。 但是,如果遇到问题,请发表评论。

另一个选择是将showPrompt(...)方法传递给StringProperty ,并在“确定”按钮的处理程序中更新属性。 然后, showPrompt的调用者可以创建StringPropertyshowPrompt其注册一个侦听器并进行观察。 就像是:

public String showPrompt(String title, String defValue, final StringProperty result){
    // ...
    final TextField txtPromptValue = new TextField(defValue);
    // ...
    btnOk.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent event) {
            result.set(txtPromptValue.getText());
            dlgStage.close();
        }
    });    

    // ...
}

然后,您使用类似以下内容的对话框:

StringProperty dialogResult = new SimpleStringProperty();
dialogResult.addListener(new ChangeListener<String>() {
    public void changed(ObservableValue<? extends String> obs, String oldValue, String newValue) { 
        // process newValue, the value from the dialog...
    }
});
showPrompt("Dialog Title", "Default value", dialogResult);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM