Как создать модальное окно в JavaFX 2.1

Я не могу понять, как создать модальное окно в JavaFX. В основном у меня есть выбор файла, и я хочу задать пользователю вопрос, когда они выбирают файл. Мне нужна эта информация для того, чтобы разобрать файл, поэтому выполнение должно ждать ответа.

Я видел этот вопрос но я не смог узнать, как реализовать это поведение.

3 ответов


здесь ссылка на решение Я создал ранее для модальных диалогов в JavaFX 2.1 Решение создает модальный этап поверх текущего этапа и выполняет действия по результатам диалога с помощью обработчиков событий для элементов управления диалогом.

обновление

Предыдущее связанное решение использует датированный подход обработчика событий для принятия мер после того, как диалог был отклонен. Этот подход действителен для реализаций до JavaFX 2.2. Для JavaFX 8+ есть нет необходимости в обработчиках событий, вместо этого используйте новый этап showAndWait() метод. Например:

Stage dialog = new Stage();

// populate dialog with controls.
...

dialog.initOwner(parentStage);
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait();

// process result of dialog operation. 
... 

обратите внимание, что для того, чтобы все работало так, как ожидалось, важно инициализировать владельца сцены и для инициализации модальности этапа либо WINDOW_MODAL или APPLICATION_MODAL.

есть некоторые высококачественные стандартные диалоги пользовательского интерфейса в JavaFX 8 и ControlsFX, если они соответствуют вашим требованиям, я советую использовать их, а не разрабатывать свои собственные. Эти встроенные JavaFX и предупреждение классы также имеют initOwner и initModality и showAndWait методы, так что вы можете установить модальность для них, как вы хотите (обратите внимание, что по умолчанию встроенные диалоги являются модальными приложениями).


на мой взгляд, это не хорошее решение, потому что родительское окно все время активно.
Например, если вы хотите открыть окно как модальное окно После нажатия кнопки...

private void clickShow(ActionEvent event) {
    Stage stage = new Stage();
    Parent root = FXMLLoader.load(
        YourClassController.class.getResource("YourClass.fxml"));
    stage.setScene(new Scene(root));
    stage.setTitle("My modal window");
    stage.initModality(Modality.WINDOW_MODAL);
    stage.initOwner(
        ((Node)event.getSource()).getScene().getWindow() );
    stage.show();
}

теперь ваше новое окно действительно модально-родительский блок. также вы можете использовать

Modality.APPLICATION_MODAL

вы можете создать приложение, как мой образец. Это только один файл JavaFX приложения.

public class JavaFXApplication1 extends Application {
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                Stage stage; 
                stage = new Stage();

                final SwingNode swingNode = new SwingNode();

                createSwingContent(swingNode);

                StackPane pane = new StackPane();
                pane.getChildren().add(swingNode);

                stage.initModality(Modality.APPLICATION_MODAL);
                stage.setTitle("Swing in JavaFX");
                stage.setScene(new Scene(pane, 250, 150));
                stage.show();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void createSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(() -> {
            try {
                Path currentRelativePath = Paths.get("");
                String s = currentRelativePath.toAbsolutePath().toString();
                JasperDesign jasperDesign = JRXmlLoader.load(s + "/src/reports/report1.jrxml");

                String query = "SELECT * FROM `accounttype`";
                JRDesignQuery jrquery = new JRDesignQuery();
                jrquery.setText(query);
                jasperDesign.setQuery(jrquery);

                JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
                JasperPrint JasperPrint = JasperFillManager.fillReport(jasperReport, null, c);
                //JRViewer viewer = new JRViewer(JasperPrint);

                swingNode.setContent(new JRViewer(JasperPrint));
            } catch (JRException ex) {
                Logger.getLogger(AccountTypeController.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}