在JavaFX任务中创建JavaFX对话框

时间:2016-05-23 14:25:06

标签: java multithreading javafx javafx-2 javafx-8

我正在尝试创建一个javafx输入对话框,我将它放在一个任务中,但我的代码没有创建任何对话框。

                Task<Void> passwordBox = new Task<Void>() {
                    @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<String> 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();

在调试时,它将进入以下任务类

的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);
                }

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

1 个答案:

答案 0 :(得分:2)

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

你可以实现它:

Task<Void> passwordBox = new Task<Void>() {
            @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<String> 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;
            }
        };