2017-07-23 29 views
8

我想寫一個簡單的方法來切換我的窗口是否最小化(即圖標化)。我越來越奇怪的行爲。下面是說明問題的可運行代碼。Stage.setIconified()和Stage.isIconified()不能正常工作

我在Gnome 3.20.4和XFCE 4.12上得到了相同的結果。我還沒有在任何其他環境中測試過這個。


  1. 如果沒有最大化窗口,代碼工作正常,但報告的狀態是在次不正確。以下是代碼的輸出。我已將筆記(<--)放在文本輸出與視覺輸出不匹配的行旁邊。

視窗未最大化行爲

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 

  • 如果最大化了窗口,如所預期的代碼不工作。相反,這是一個三步過程。第一次呼叫圖標化,第二次呼叫恢復,第三次呼叫不作任何視覺改變。

  • 視窗最大化的行爲

    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 
    
    ... 
    

    下面是可運行的代碼:


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

    回答

    0

    看來你在你的程序中的錯字,你有2個階段.isIconified()的時候你應該有一個

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

    應該

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