Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Update

В предыдущем связанном решении используется датированный подход обработчика событий для принятия решения после отклонения диалога. Этот подход был действителен для реализации до 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. 
... 

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

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

Ответ 2

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

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

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

Modality.APPLICATION_MODAL

Ответ 3

Вы можете создать приложение подобно моему образцу. Это всего лишь однофазное приложение 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);
    }
}