2017-07-23 30 views
8

Próbuję napisać prostą metodę przełączania, czy moje okno jest zminimalizowane (to znaczy ikona). Dostaję dziwne zachowanie. Poniżej znajduje się działający kod ilustrujący problem.Stage.setIconified() i Stage.isIconified() nie działa prawidłowo

Otrzymuję takie same wyniki dla Gnome 3.20.4 i XFCE 4.12. Nie testowałem tego jeszcze w żadnym innym środowisku.


  1. Jeśli okno nie jest zmaksymalizowane, kod działa zgodnie z oczekiwaniami, ale odnotowano stan jest nieprawidłowy czasami. Oto wynik z poniższego kodu. Umieściłem notatki (<--) obok linii, w których tekstowe wyjście nie pasuje do wizualnego wyniku.

Windows nie Zmaksymalizowana Zachowanie

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. Jeśli okno jest zmaksymalizowane, kod nie działa zgodnie z oczekiwaniami. Zamiast tego jest to proces trzystopniowy. Wywoływane jest pierwsze połączenie, drugie połączenie jest przywracane, a trzecie wywołanie nie powoduje żadnych wizualnych zmian.

Okna Zmaksymalizowana Zachowanie

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 

... 

Oto kod uruchamialny:


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(); 
    } 
} 

Odpowiedz

0

Wydaje masz literówkę w swoim programie masz 2 etap .isIconified(), gdy powinieneś mieć jeden

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

Powinno być

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