2012-05-07 3 views
32

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

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

ответ

33

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

Update

Настоятель связано решение использует устаревшую обработчика событий подход к принятию решения после того, как диалог был удален с поля. Этот подход был действителен для реализации до JavaFX 2.2. Для JavaFX 8+ нет необходимости в обработчиках событий, вместо этого используйте новый метод Stage 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 либо WINDOW_MODAL или APPLICATION_MODAL.

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

+3

Библиотека ControlsFX разработана для JavaFX версии 8.0 и выше, которая будет выпущена в первом квартале 2014 года, поэтому ее следует учитывать. – bazeusz

+0

@jewelsea есть ли функция filechooser для javafx 1.3? –

+0

Авинаш, лучше задать новый вопрос как новый вопрос. JavaFX 1.3 устарел, я не советую его использовать. Я не думаю, что у него был файл FileChooser, хотя вы могли бы использовать Swing [JFileChooser] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFileChooser.html) с этим. – jewelsea

59

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

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 
+2

Мне пришлось использовать stage.initModality (Modality.APPLICATION_MODAL); , чтобы заблокировать вызов родителя. Даже использование showAndWait() не блокировало вызывающего абонента (я звонил из JFXPanel - не уверен, что это имело значение.) – torwalker

+1

Это должен быть принятый ответ –

-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); 
    } 
} 
+2

Это может улучшить качество вашего ответа, если вы добавили объяснение того, что о вашем ответе, который, по вашему мнению, поможет и почему. – toonice

Смежные вопросы