天天看點

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;

}

};