2013-06-08 17 views
21

Come dice il titolo, la mia domanda è, come posso impedire/annullare la chiusura della fase primaria in JavaFX 2.2? Ho fatto qualche ricerca su Google, e le seguenti due collegamenti sembrava di affrontare la questione:Previene/annulla la chiusura della fase primaria in JavaFX 2.2

Ho provato i metodi spiegate da questi due link, ma purtroppo per me , nessuno di loro funziona. Quindi, senza ulteriori indugi, ecco cosa ho fatto.

In primo luogo, ho provato ad allegare un OnCloseRequest allo primaryStage come segue.

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     if (!canExit()) { 
      event.consume(); 
      primaryStage.show(); // I tried without this line also. 
     } 
    } 
}); 

Quando canExit() rendimenti false, ho cercato di impedire l'evento di propagarsi ulteriormente e provocare per uscire l'applicazione chiamando event.consume(). Ma la fase si sta chiudendo/nascosta e ho ricevuto i seguenti messaggi di errore sulla finestra di output di Netbeans. Continua a venire ripetutamente fino a quando non chiudo l'app da Netbeans.

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed 

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed 

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed 

aver assaggiato il fallimento in questo tentativo, ho cambiato OnCloseRequest-OnHiding con l'aspettativa di successo.

primaryStage.setOnHiding(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     if (!canExit()) { 
      event.consume(); 
      primaryStage.show(); // I tried without this line also. 
     } 
    } 
}); 

Anche se, in questo tentativo, ho assaggiato il fallimento, penso di aver fatto dei progressi. Non ci sono messaggi di errore questa volta e non è necessario forzare la chiusura dell'applicazione da Netbeans.

Poi ho letto di un metodo magico denominato setImplicitExit() nella classe Platform. Pensando che questo è quello che mi mancava, ho provato Platform.setImplicitExit(false); con entrambi i due metodi come segue:

  1. OnCloseRequest versione

    Platform.setImplicitExit(false); 
    
    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
        if (!canExit()) { 
         // ... 
        } else { 
         Platform.exit(); 
        } 
    }); 
    

    Nessuna differenza, lo stadio viene chiuso/nascosto, e lo stesso messaggio di errore viene ripetutamente.

  2. OnHiding versione

    Platform.setImplicitExit(false); 
    
    primaryStage.setOnHiding(new EventHandler<WindowEvent>() { 
        if (!canExit()) { 
         // ... 
        } else { 
         Platform.exit(); 
        } 
    }); 
    

    Cominciando con una nota positiva, l'applicazione non viene usciti come in precedenza. Ma la nota negativa è che il palco è ancora chiuso/nascosto.

Ora, io sono fuori di armi/attrezzature nella mia armeria per risolverlo, e così io sono qui per richiedere l'aiuto di voi eroi e campioni. Quindi, come posso risolvere questo problema o cosa ho fatto di sbagliato o cosa mi manca?

risposta

2

Penso che tu abbia sbagliato il onCloseRequest(). Se consumi l'evento, cancelli la chiusura!Così funziona l'altro perché turno, se canExit() restituisce false si consuma l'evento

+0

Grazie per notare che, ho modificato la mia domanda. La condizione è diversa nel codice sul mio progetto, ho usato 'canExit()' per rendere lo snippet di codice più leggibile. Ma ancora non risponde per l'errore che sto ottenendo. – Jomoos

+1

Ancora non capisco perché chiami primaryStage.show! The Stage non è affatto chiuso quindi perché chiamare show? – tomsontom

+0

Inizialmente, ho provato senza quella linea e il palco si stava chiudendo/nascosto. Poi ho pensato che il palcoscenico fosse chiuso quando l'evento è stato sparato, e quindi mettere un 'show' farà il trucco. Anche questo non funziona. Ho già commentato la riga in questione come "Ho provato anche senza questa riga" – Jomoos

21

Ho usato seguente codice nella mia applicazione e funziona perfettamente,

Platform.setImplicitExit(false); 

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     event.consume(); 
    } 
}); 
+2

Ho provato lo stesso e la finestra si è nascosta/chiusa e l'errore ('(java: 3187): Gtk-CRITICAL **: IA__gtk_widget_get_visible: l'asserzione 'GTK_IS_WIDGET (widget)' fallita') appare continuamente su console/terminale fino a quando non chiudo forzatamente l'app. – Jomoos

+0

Quale sistema operativo si sta utilizzando? Se è MAC o Ubuntu, tali errori sono comuni, puoi semplicemente ignorarlo se non influisce sulla tua applicazione. –

+0

Sto usando Fedora 18 e il problema è che non posso impedire che lo stage venga chiuso/nascosto se ci sono alcune modifiche non salvate nell'app, se ignoro questa sezione. – Jomoos

2

Penso che questo sia un bug con JavaFX per Linux . Ho eseguito lo stesso problema su Javafx 2.2.21-b11. A seconda del contesto, gli errori GTK potrebbero essere presenti o meno, ma in entrambi i casi il consumo dell'evento di richiesta chiusa non impediva la chiusura della finestra (tuttavia il processo continua a essere eseguito). La stessa app su Windows si è comportata come mi sarei aspettato. Quindi nel migliore dei casi abbiamo una differenza di comportamento tra piattaforme.

ho presentato un bug report è possibile upvote se vuoi: https://javafx-jira.kenai.com/browse/RT-33295

Ecco la fonte della mia applicazione di test

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.stage.Stage; 
import javafx.stage.WindowEvent; 

public class Boom extends Application { 
    @Override 
    public void start(final Stage primary) { 
     System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()); 
     primary.setOnCloseRequest(new EventHandler<WindowEvent>() { 
      @Override 
      public void handle(WindowEvent e) { 
       e.consume(); 
      } 
     }); 
     primary.show(); 
    } 

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

E hanno risposto contrassegnandolo come duplicato e con la seguente risposta: "Questo problema è già stato risolto in JDK 8 e 7u40." – kylejmcintyre

Problemi correlati