2017-07-23 3 views
8

J'essaye d'écrire une méthode simple pour basculer si ma fenêtre est minimisée (c'est-à-dire iconifiée). Je reçois un comportement étrange. Voici un code exécutable qui illustre le problème.Stage.setIconified() et Stage.isIconified() n'agissent pas correctement

Je reçois les mêmes résultats sur Gnome 3.20.4 et XFCE 4.12. Je n'ai pas encore testé cela dans un autre environnement.


  1. Si la fenêtre est pas agrandie, le code fonctionne comme prévu, mais l'état signalé est incorrect parfois. Voici la sortie du code ci-dessous. J'ai mis des notes (<--) à côté des lignes où la sortie textuelle ne correspond pas à la sortie visuelle.

Windows ne maximisée Comportement

Before call (Note: Window appears iconified) 
    isIconified(): true 
    isMaximized(): true 

Setting iconified to false 

After call (Note: Window now appears restored, not maximized) 
    isIconified(): true <-- The window is visually not iconified 
    isMaximized(): true <-- The window is visually not maximized 


Before call (Note: Window still appears restored, not maximized) 
    isIconified(): false <-- One second later, the report is accurate 
    isMaximized(): false 

Setting iconified to true 

After call (Note: Window now appears iconified) 
    isIconified(): true 
    isMaximized(): true 

  1. Si la fenêtre est agrandie, le code ne fonctionne pas comme prévu. Au lieu de cela, il s'agit d'un processus en trois étapes. Le premier appel symbolise, le deuxième appel est restauré et le troisième appel n'effectue aucun changement visuel.

de Windows maximisée Comportement

Before call (Note: Window appears iconified) 
    isIconified(): true 
    isMaximized(): true 

Setting iconified to false 

After call (Note: Window appears maximized) 
    isIconified(): true <-- Does not match visual 
    isMaximized(): true 


Before call (Note: Window appears maximized) 
    isIconified(): true <-- Does not match visual 
    isMaximized(): true 

Setting iconified to false 

After call (Note: Window appears maximized) 
    isIconified(): false 
    isMaximized(): false <-- Does not match visual 


Before call (Note: Window appears maximized) 
    isIconified(): false 
    isMaximized(): false <-- Does not match visual 

Setting iconified to true 

After call (Note: Window appears iconified) 
    isIconified(): true 
    isMaximized(): true 

<Now it loops> 

Before call (Note: Window appears iconified) 
    isIconified(): true 
    isMaximized(): true 

Setting iconified to false 

After call (Note: Window appears maximized) 
    isIconified(): true <-- Does not match visual 
    isMaximized(): true 

... 

Voici le code runnable:


import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.stage.Stage; 

public class StageTest extends Application { 

    Stage stage; 

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

    @Override 
    public void start (Stage stage) throws Exception { 
     this.stage = stage; 
     stage.setResizable(true); 
     stage.show(); 

     Thread thread = new Thread (() -> { 
      while (true) { 
       Platform.runLater(() -> { 
        toggleMinimized(); 
       }); 
       try { 
        Thread.sleep (1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.setDaemon(true); 
     thread.start(); 

    } 

    public void toggleMinimized() { 

     System.out.println ("Before call"); 
     System.out.println ("\tisIconified(): " + stage.isIconified()); 
     System.out.println ("\tisMaximized(): " + stage.isIconified()); 
     System.out.println(); 

     if (stage.isIconified()) { 
      System.out.println ("Setting iconified to false"); 
      System.out.println(); 
      stage.setIconified(false); 
     } else { 
      System.out.println ("Setting iconified to true"); 
      System.out.println(); 
      stage.setIconified(true); 
     } 


     System.out.println ("After call"); 
     System.out.println ("\tisIconified(): " + stage.isIconified()); 
     System.out.println ("\tisMaximized(): " + stage.isMaximized()); 
     System.out.println(); 
     System.out.println(); 
    } 
} 

Répondre

0

Il semble que vous ayez une faute de frappe dans votre programme que vous avez 2 étapes .isIconified() quand vous devriez en avoir un

public void toggleMinimized() { 
    System.out.println ("Before call"); 
    System.out.println ("\tisIconified(): " + stage.isIconified()); 
    System.out.println ("\tisMaximized(): " + stage.isIconified()); 

Il devrait être

public void toggleMinimized() { 
    System.out.println ("Before call"); 
    System.out.println ("\tisIconified(): " + stage.isIconified()); 
    System.out.println ("\tisMaximized(): " + stage.isMaximized());