天天看点

java fx dialog_在JavaFX任务中创建JavaFX对话框

我正在尝试创建一个

javafx输入对话框,我把它放在一个任务中,但我的代码没有创建任何对话框.

Task passwordBox = new Task() {

@Override

protected Void call() throws Exception {

TextInputDialog dialog = new TextInputDialog("walter");

dialog.setTitle("Text Input Dialog");

dialog.setHeaderText("Look, a Text Input Dialog");

dialog.setContentText("Please enter your name:");

// Traditional way to get the response value.

Optional result = dialog.showAndWait();

if (result.isPresent()){

System.out.println("Your name: " + result.get());

}

// The Java 8 way to get the response value (with lambda expression).

result.ifPresent(name -> System.out.println("Your name: " + name));

return null;

}

};

Thread pt = new Thread(passwordBox);

pt.start();

在调试时,它将进入以下Task类的catch方法

catch (final Throwable th) {

// Be sure to set the state after setting the cause of failure

// so that developers handling the state change events have a

// throwable to inspect when they get the FAILED state. Note

// that the other way around is not important -- when a developer

// observes the causeOfFailure is set to a non-null value, even

// though the state has not yet been updated, he can infer that

// it will be FAILED because it can be nothing other than FAILED

// in that circumstance.

task.runLater(() -> {

task._setException(th);

task.setState(State.FAILED);

});

// Some error occurred during the call (it might be

// an exception (either runtime or checked), or it might

// be an error. In any case, we capture the throwable,

// record it as the causeOfFailure, and then rethrow. However

// since the Callable interface requires that we throw an

// Exception (not Throwable), we have to wrap the exception

// if it is not already one.

if (th instanceof Exception) {

throw (Exception) th;

} else {

throw new Exception(th);

}

如果我没有将对话框放在任务中,则导致应用程序挂起.

最佳答案 您必须确保在

JavaFX Application Thread上打开对话框,因为每次GUI更新都必须在JavaFX中的此线程上进行.

你可以实现它:

Task passwordBox = new Task() {

@Override

protected Void call() throws Exception {

Platform.runLater(new Runnable() {

@Override

public void run() {

TextInputDialog dialog = new TextInputDialog("walter");

dialog.setTitle("Text Input Dialog");

dialog.setHeaderText("Look, a Text Input Dialog");

dialog.setContentText("Please enter your name:");

// Traditional way to get the response value.

Optional result = dialog.showAndWait();

if (result.isPresent()){

System.out.println("Your name: " + result.get());

}

// The Java 8 way to get the response value (with lambda expression).

result.ifPresent(name -> System.out.println("Your name: " + name));

}

});

return null;

}

};