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.
Đó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
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ố. –