2013-07-24 3 views
0

Я использую пример this для создания модального диалога приложения. Когда я нажимаю кнопку выхода в своем диалоговом окне (красный в правом верхнем углу), все работает нормально. Диалог закрывается, а затем я могу открыть его нормально. Но когда я пытаюсь добавить Button, который закрывает мой диалог, все работает нормально, пока я не попытаюсь его снова открыть. После этого он бросает мне IllegalStateException (я буду обновлять ответ с этим исключением, если это необходимо).JavaFX закрывающее приложение модальный диалог

Это обработчик события, который демонстрирует, как я закрыть диалоговое окно:

btnClose.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      dialog.close(); 
     } 
    }); 

Может кто-нибудь сказать мне, как правильно закрыть диалог приложения модальных? Заранее спасибо.

ответ

3

Редактировать

Я вижу, что вы нашли ваш вопрос, думаю, я просто держать свой ответ с кодом образца в случае кто-то другой подобный вопрос.


Ваше действие btnClose работает для меня, поэтому проблема, вероятно, в некотором коде, который вы еще не опубликовали.

Вот пример я создал, чтобы проверить:

import javafx.application.Application; 
import javafx.event.*; 
import javafx.geometry.Pos; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.*; 

public class DialogClosing extends Application { 
    @Override public void start(final Stage stage) { 
     final Button showDialog = new Button("Show Dialog"); 
     showDialog.setOnAction(new EventHandler<ActionEvent>() { 
      @Override public void handle(ActionEvent actionEvent) { 
       showDialog(stage, showDialog); 
      } 
     }); 

     StackPane layout = new StackPane(); 
     layout.getChildren().setAll(
      showDialog 
     ); 

     layout.setStyle("-fx-padding: 10px;"); 
     stage.setScene(
      new Scene(
       layout 
      ) 
     ); 
     stage.show(); 
    } 

    private Stage showDialog(Window parent, final Node showControlNode) { 
     showControlNode.setDisable(true); 

     final Stage dialog = new Stage(); 
     dialog.initOwner(parent); 
     dialog.initStyle(StageStyle.UTILITY); 
     dialog.setX(parent.getX()); 
     dialog.setY(parent.getY() + parent.getHeight()); 

     Button closeDialog = new Button("Close Dialog"); 
     closeDialog.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent actionEvent) { 
       dialog.close(); 
      } 
     }); 
     dialog.setOnHidden(new EventHandler<WindowEvent>() { 
      @Override 
      public void handle(WindowEvent windowEvent) { 
       showControlNode.setDisable(false); 
      } 
     }); 

     VBox layout = new VBox(10); 
     layout.setAlignment(Pos.CENTER); 
     layout.getChildren().addAll(
      new Label("Hello World!"), 
      closeDialog 
     ); 
     layout.setStyle("-fx-padding: 10px;"); 

     Scene scene = new Scene(
      layout, 
      125, 
      100 
     ); 

     dialog.setScene(scene); 
     dialog.show(); 

     return dialog; 
    } 

    public static void main(String[] args) { launch(args); } 
} 

closingtimeoutput

+0

Спасибо за усилия. Да, он работает до тех пор, пока Stage не будет объявлен как статический. –

1

Хорошо, неважно. Все исправлено. Извините за неудобства. Проблема заключалась в том, что я объявлял свой Stage статичным.

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