Stage.setIconified()和Stage.isIconified()无法正常运行

时间:2017-07-23 19:34:53

标签: javafx javafx-8

我正在尝试编写一个简单的方法来切换我的窗口是否被最小化(即图标化)。我的行为很奇怪。下面是说明问题的可运行代码。

我在Gnome 3.20.4和XFCE 4.12上获得了相同的结果。我还没有在任何其他环境中对此进行测试。

  1. 如果窗口未最大化,则代码按预期工作,但报告的状态有时不正确。这是以下代码的输出。我已将音符(<--)放在文本输出与视觉输出不匹配的行旁边。
  2. Windows未最大化行为

    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. 如果窗口最大化,则代码无法按预期工作。相反,这是一个三步过程。第一个呼叫图标化,第二个呼叫恢复,第三个呼叫没有进行任何视觉变化。
    2. Windows最大化行为

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

1 个答案:

答案 0 :(得分:0)

你的程序中有一个错字,你有2个stage.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() );