2013-06-08 7 views
21

Jak mówi tytuł, moje pytanie brzmi: jak mogę zapobiec/anulować zamknięcie podstawowego etapu w JavaFX 2.2? Zrobiłem rozeznanie w Google, a następujące dwa linki wydawało się rozwiązać problem:Zapobieganie/anulowanie zamykania podstawowego etapu w JavaFX 2.2

Próbowałem metody wyjaśnione przez te dwa linki, ale niestety dla mnie żaden z nich nie działa. Tak więc, bez dalszych ceregieli, oto, co zrobiłem.

Po pierwsze, próbowałem dołączyć OnCloseRequest do primaryStage w następujący sposób.

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

Kiedy canExit() powraca false, starałem się zapobiec zdarzenie od propagacji dalej i spowodować, aby zamknąć aplikację, wywołując event.consume(). Ale etap staje się zamknięty/ukryty i mam następujące komunikaty o błędach w oknie wyjściowym Netbeans. Ciągle nadchodzi, dopóki nie wymuszam zamknięcia aplikacji od 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 

Po skosztował niepowodzenie w tej próbie, zmieniłem OnCloseRequest do OnHiding z oczekiwaniem sukcesu.

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

Mimo, że próbowałem również niepowodzenia w tej próbie, myślę, że zrobiłem pewne postępy. Tym razem nie ma komunikatów o błędach i nie trzeba wymuszać zamknięcia aplikacji z Netbeans.

Potem czytałem o pewnej magicznej metodzie o nazwie setImplicitExit() w klasie Platform. Myśląc, że to jest to, czego mi brakuje, próbowałem Platform.setImplicitExit(false); zarówno z dwóch metod w następujący sposób:

  1. OnCloseRequest wersję

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

    żadnej różnicy, etap zostanie zamknięty/ukryte, a tym samym komunikat o błędzie pojawia się wielokrotnie.

  2. OnHiding wersja

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

    Począwszy pozytywnym akcentem, aplikacja nie zostanie zakończony, jak wcześniej. Ale negatywną nutą jest to, że scena wciąż się zamyka/ukrywa.

Teraz jestem z broni/sprzętów w moim arsenale go rozwiązać, a więc jestem tutaj, aby poprosić o pomoc was bohaterów i mistrzów. Jak mogę rozwiązać ten problem lub co zrobiłem źle lub czego mi brakuje?

Odpowiedz

2

Wydaje mi się, że poprawiono błąd onCloseRequest(). Jeśli spożyjesz to wydarzenie, anulujesz zamknięcie!Tak to działa druga dlaczego okrągłe, jeśli canExit() zwraca false spożywać zdarzenie

+0

Dzięki za zauważyć, że I edycja moje pytanie. Warunek jest inny w kodzie w moim projekcie, użyłem 'canExit()', aby fragment kodu był bardziej czytelny. Ale nadal nie odpowiada za błąd, który otrzymuję. – Jomoos

+1

Nadal nie rozumiem, dlaczego nazywasz primaryStage.show! Scena nie jest zamknięta, więc dlaczego wywołanie się wyświetla? – tomsontom

+0

Początkowo próbowałem bez tej linii, a etap się zamykał/ukrywał. Wtedy pomyślałem, że może to być etap zamknięty, gdy wydarzenie zostanie odpalone, więc postawienie 'show' może załatwić sprawę. To też nie działa. Skomentowałem już o tej linii jako "próbowałem bez tej linii również." – Jomoos

21

użyłem następujący kod w mojej aplikacji i działa idealnie,

Platform.setImplicitExit(false); 

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

Próbowałem to samo i okno zostaje ukryte/zamknięte i błąd ('(java: 3187): Gtk-CRITICAL **: IA__gtk_widget_get_visible: asercja 'GTK_IS_WIDGET (widget)' failed') pojawia się ciągle na konsoli/terminalu, dopóki nie wymuszam zamknięcia aplikacji. – Jomoos

+0

Z jakiego systemu operacyjnego korzystasz? Jeśli jest to MAC lub ubuntu, takie błędy są częste, możesz je po prostu zignorować, jeśli nie wpłynie to na twoją aplikację. –

+0

Używam Fedory 18, a problem polega na tym, że nie mogę zapobiec zamknięciu/ukryciu sceny, jeśli są jakieś niezapisane zmiany w aplikacji, jeśli zignoruję tę sekcję. – Jomoos

2

myślę, że to jest błąd z JavaFX dla Linuksa . Wpadłem na ten sam problem w Javafx 2.2.21-b11. W zależności od kontekstu błędy GTK mogą być lub mogą nie występować, ale tak czy inaczej zdarzenie zamykania żądania nie przeszkodziło w zamknięciu okna (ale proces nadal trwa). Ta sama aplikacja w systemie Windows zachowywała się tak, jak się spodziewałam. W najlepszym razie mamy różnice w zachowaniu na różnych platformach.

I złożył raport o błędzie można upvote jeśli chcesz: https://javafx-jira.kenai.com/browse/RT-33295

tutaj jest źródłem mojej aplikacji testowej

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

Odpowiedzieli, zaznaczając go jako duplikat i z następującą odpowiedzią: "Ten problem został już naprawiony w JDK 8 i 7u40." – kylejmcintyre