2012-05-07 2 views
32

JavaFX에서 모달 창을 만드는 방법을 알 수 없습니다. 기본적으로 파일 선택기가 있으며 파일을 선택할 때 사용자에게 질문을하고 싶습니다. 파일을 파싱하려면이 정보가 필요하므로 실행이 응답을 기다려야합니다.JavaFX 2.1에서 모달 창을 만드는 방법

나는 this question을 보았지만이 동작을 구현하는 방법을 찾을 수 없었습니다. 여기

답변

33

내가 용액 현재 스테이지 위에 모달 스테이지를 생성하고, 대화 제어를위한 이벤트 핸들러를 통해 대화 결과에 대해 조치를 취 자바 FX 2.1 모달 다이얼로그에 대해 이전에 생성 link to a solution이다.

업데이트

선행 연결 솔루션은 대화 상자가 해산 된 후에 조치를 취할 날짜가 이벤트 핸들러 접근 방식을 사용합니다. 이 접근법은 JavaFX 2.2 이전 구현에 유효합니다. JavaFX 8 이상에서는 이벤트 핸들러가 필요하지 않으며 대신 새 Stage showAndWait() 메소드를 사용하십시오. 예상대로 작동하는 것들에 대한 위해가 WINDOW_MODAL 또는 APPLICATION_MODAL 중 하나에 스테이지의 양상을 초기화하는 스테이지 의 소유자를 초기화하는 것이 중요하다,

Stage dialog = new Stage(); 

// populate dialog with controls. 
... 

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

// process result of dialog operation. 
... 

참고 : 예를 들면.

JavaFX 8ControlsFX에 몇 가지 고품질 표준 UI 대화 상자가 있습니다. 사용자 요구 사항에 맞으면 자체 개발보다는 사용하는 것이 좋습니다. 내장 된 JavaFX DialogAlert 클래스에는 또한 initOwnerinitModality 및메쏘드가 있으므로 사용자가 원하는대로 양식을 설정할 수 있습니다. 기본적으로 내장 대화 상자는 응용 프로그램 모달입니다.

+3

ControlsFX 라이브러리는 2014 년 1 월에 릴리스 될 JavaFX 버전 8.0 이상용으로 개발되었으므로 고려해야합니다. – bazeusz

+0

@jewelsea는 javafx 1.3 용 파일 선택기 기능이 있습니까? –

+0

Avinash, 새 질문을 새 질문으로하는 것이 가장 좋습니다. JavaFX 1.3은 쓸모가 없으므로 사용하지 말라. Swing [JFileChooser] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFileChooser.html)을 사용할 수는 있지만 직접 FileChooser가 있다고 생각하지 않습니다. 그것으로. – 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(); 
} 

이제 새 창 REALY 모달입니다 - 부모가 블록입니다. 도 사용하실 수 있습니다

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

관련 문제