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

33

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

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

Ваш Ответ

3   ответа
37

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

Обновит

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

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 методов, так что вы можете установить для них модальность по своему усмотрению (обратите внимание, что по умолчанию встроенные диалоги являются модальными для приложения).

иблиотека @ControlsFX была разработана для JavaFX версии 8.0 и выше и будет выпущена в первом квартале 2014 года, поэтому необходимо учитывать е bazeusz
@ jewelsea есть ли какая-нибудь функция выбора файлов для javafx 1.3? Avinash Raj
Авинаш, лучше задать новый вопрос как новый. JavaFX 1.3 устарела, я не советую использовать его. Я не думаю, что у него был FileChooser, хотя вы могли бы использовать Swing JFileChooser с этим jewelsea
65

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

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
Мне пришлось использовать stage.initModality (Modality.APPLICATION_MODAL); заблокировать вызов родителя. Даже использование showAndWait () не блокировало вызывающего (я звонил из JFXPanel - не уверен, имело ли это какое-либо значение.) torwalker
Это должен быть принятый ответ Tony BenBrahim
-1

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

Похожие вопросы