[英]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
方法。
正如安德烈说 ,你需要做的就是创建自己的自定义PromptStage
与showPrompt
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
的调用者可以创建StringProperty
, showPrompt
其注册一个侦听器并进行观察。 就像是:
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.