2012-07-13 30 views
5

Tôi mới dùng JavaFx và tôi đang tạo một ứng dụng và cần một cái gì đó tương tự như JDialog được cung cấp trong khi sử dụng các thành phần swing. Tôi đã giải quyết điều đó bằng cách tạo ra giai đoạn mới, nhưng bây giờ tôi cần một cách để đóng giai đoạn mới từ bên trong chính nó bằng cách nhấp vào một nút. (vâng, nút x cũng hoạt động, nhưng cũng muốn nút đó). Để mô tả tình huống: Tôi có một lớp học chính mà từ đó tôi tạo ra sân khấu chính với một cảnh. Tôi sử dụng FXML cho điều đó.JavaFX2: Đóng một giai đoạn (substage) từ bên trong chính nó

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml")); 
    stage.setTitle("Ring of Power - Builder"); 
    stage.setScene(new Scene(root)); 
    stage.setMinHeight(600.0); 
    stage.setMinWidth(800.0); 
    stage.setHeight(600); 
    stage.setWidth(800); 
    stage.centerOnScreen(); 
    stage.show(); 
} 

Bây giờ trong cửa sổ chính xuất hiện, tôi có tất cả các mục điều khiển và menu và nội dung, được thực hiện thông qua FXML và lớp điều khiển thích hợp. Đó là phần tôi quyết định đưa thông tin Giới thiệu vào menu Trợ giúp. Vì vậy, tôi có một sự kiện đang diễn ra khi trình đơn Trợ giúp - Giới thiệu được kích hoạt, như sau:

@FXML 
private void menuHelpAbout(ActionEvent event) throws IOException{ 
    Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml")); 
    Stage aboutBox=new Stage(); 
    aboutBox.setScene(new Scene(root2)); 
    aboutBox.centerOnScreen(); 
    aboutBox.setTitle("About Box"); 
    aboutBox.setResizable(false); 
    aboutBox.initModality(Modality.APPLICATION_MODAL); 
    aboutBox.show(); 
} 

Như đã thấy cửa sổ Giới thiệu được tạo thông qua FXML với lớp điều khiển một lần nữa. Có một hình ảnh, một vùng văn bản và một nút, và tôi muốn nút đó để đóng sân khấu mới là aboutBox từ bên trong lớp AboutBox.java để nói.

Cách duy nhất tôi tìm thấy chính mình để có thể làm điều này, là để xác định Giai đoạn tĩnh công khai về hộp; bên trong lớp Builder.java và tham chiếu đến lớp đó từ bên trong AboutBox.java trong phương thức xử lý sự kiện hành động trên nút đóng. Nhưng bằng cách nào đó nó không cảm thấy chính xác trong sạch và đúng. Có cách nào tốt hơn không?

Cảm ơn trước lời khuyên của bạn.

Trả lời

21

Bạn có thể lấy được giai đoạn sẽ bị đóng từ sự kiện được chuyển đến trình xử lý sự kiện.

new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    // take some action 
    ... 
    // close the dialog. 
    Node source = (Node) actionEvent.getSource(); 
    Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
    } 
} 
+8

Đóng cửa sổ như thế này sẽ bỏ qua trình xử lý sự kiện onCloseRequest (nếu có). Tôi sẽ thêm dòng stage.getOnCloseRequest(). Handle (null); ngay trước stage.close(); – beardedlinuxgeek

+1

Cảm ơn bạn @beardedlinuxgeek. Tôi đã có vấn đề này - cửa sổ của tôi đã được đóng cửa, nhưng xử lý sự kiện tôi đã đăng ký đã không được gọi. Giải pháp của bạn đã khắc phục được sự cố. –

1

Trong JavaFX 2.1, bạn có ít lựa chọn. Cách như câu trả lời trong jewelsea hay cách gì bạn đã làm đã hoặc sửa đổi phiên bản của nó như

public class AboutBox extends Stage { 

    public AboutBox() throws Exception { 
     initModality(Modality.APPLICATION_MODAL); 
     Button btn = new Button("Close"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       close(); 
      } 
     }); 

     // Load content via 
     // EITHER 

     Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); 
     setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); 

     // OR 

     Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); 
     setScene(aboutScene); 

     // If your about page is not so complex. no need FXML so its Controller class too. 
    } 
} 

với việc sử dụng như

new AboutBox().show(); 

trong mục menu xử lý sự kiện hành động.

+0

Thực tế có một chút khó khăn với giải pháp. Có vẻ như nó không thích phiên bản đầu tiên với FXML. – Meg

+0

Vấn đề có vẻ là thực tế là bạn gọi lớp AboutBox.java mà chính nó được coi là lớp kiểm soát cho AboutBox.fxml Trừ khi đó là lý do tại sao bạn viết AboutPage.fxml < – Meg

+0

@Meg. Đã cập nhật câu trả lời. AboutBox.java cũng không phải là bộ điều khiển của AboutBox.fxml hoặc AboutPage.fxml. –

Các vấn đề liên quan