IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Problém s ukončením JavaFX aplikace

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Navry
Člen
Avatar
Navry:4.2.2020 9:35

Nejde mě ukončit JavaFX aplikace po zavření okna.

Používám:
IntelliJ IDEA 2019.3.2 (Ultimate Edition)
JDK 1.8
Buildování projektu: Gradle 5.2.1
Windows 10 Home 1909

Moje hlavní třída vypadá takto:

public class SysModelerApplication extends Application {

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

    @Override
    public void start(Stage primaryStage) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("MainScene.fxml"));
        Scene mainScene = new Scene(root);
        primaryStage.setTitle("System Modeler");
        primaryStage.setScene(mainScene);
        primaryStage.setResizable(true);
        primaryStage.show();

        // tohle se ani pouzivat nemusi (ani to ten problem neresi)
        primaryStage.setOnCloseRequest(event -> {
            System.out.println("DEBUG: primaryStage.setOnCloseRequest");
            Platform.exit();
        });

    }
}

Co se děje:
Když spustím aplikaci přez v IDEI, nebo ručně JAR v příkazovým řádku normálně se mi otevře JavaFX okno tý aplikace.
Když okno zavřu - aplikace (proces) běží dál

  • v IDEI to musím ukončit pomocí toho červených čtverečku a pak v terminálu dostanu "Process finished with exit code -1", standardně aplikace vrací "Process finished with exit code 0"
  • v příkazovým řádku nevyskočí prompt dokud nezmáčknu CTRL+C

Jinak ve správci úloh při spuštění aplikace se normálně objeví v seznamu aplikací "Java (TM) Platform SE Binary", ale ve chvíli kdy ukončím aplikaci (zavřu okno) se to objeví v seznamu "Procesy na pozadí" a musím ten proces ručně ukončit (pokud jsem tu aplikaci zpouštěl přez GUI a né přez CMD/IDEA)

Jinak mám tam dependency na SQLite:

// https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.28.0'

ale to v současné době vůbec nepoužívám, žádný

DriverManager.getConnection("jdbc:sqlite:" ...);

nebo podobný věci jako že bych měl otevřený nějaký resource.

Vůbec nevím co s tím a takhle se to nedá používat. :-(

Chci docílit: Standardní ukončení JavaFX aplikace (procesu) při zavření hlavního okna (Stage).

 
Odpovědět
4.2.2020 9:35
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:4.2.2020 10:18

Napiš příkaz:

primaryStage.setOnCloseRequest(evt -> System.exit(0));
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
4.2.2020 10:18
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Robert Michalovič:4.2.2020 12:02

Jakou přesně subverzi Javy máš ? Zkus, ji změnit. Já používám 8_201 tak tam mi to nedělá. A taky na 11_b28 ( neboli 18.9 ) a tam taky nic. Po ukončení proces mizí.
A co třeba Swing aplikace? Jak se to chová ? Co konzolová aplikace ?
Zkus build bez té dependency(smazat z pom.xml) a co to udělá.

PS. u Javy 8 a níž se všechny class uložené v projektu + JVM načetly do JVM (tvz. známé jako classpath hell -> proto vynalezly modularitu, kdy se načtou pouze classy z projektu a JVM které přes moduly nastavíš). Takže to, že ji v kódu nepoužíváš neznamená, že nějaké inicializace těch objektů z těch class neproběhnou. Toto nemám ale ověřené pouze jsem to v četl v odborné literatuře.

 
Nahoru Odpovědět
4.2.2020 12:02
Avatar
Navry
Člen
Avatar
Odpovídá na Lubor Pešek
Navry:4.2.2020 17:37

Tak použití

System.exit(0);

problém vyřešilo. Akorát to není asi úplně korektní, dle dokumentace by právě k ukončování JavaFX aplikací měl sloužit

Platform.exit();

To by mě i zajímalo proč to teda nefunguje.

 
Nahoru Odpovědět
4.2.2020 17:37
Avatar
Odpovídá na Navry
Matúš Olejník:4.2.2020 20:21

Niečo s threadmi, thread pool atď., v programe nevykonávaš?

Nahoru Odpovědět
4.2.2020 20:21
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.