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

Jos*_*uaD 7 javafx javafx-8

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

我在Gnome 3.20.4和XFCE 4.12上获得了相同的结果.我还没有在任何其他环境中测试过这个.


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

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
Run Code Online (Sandbox Code Playgroud)
  1. 如果窗口最大化,则代码无法按预期工作.相反,这是一个三步过程.第一个呼叫图标化,第二个呼叫恢复,第三个呼叫不进行任何视觉变化.

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

...
Run Code Online (Sandbox Code Playgroud)

这是可运行的代码:


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 ();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 1

看来你的程序中有一个拼写错误,你应该有一个 stage.isIconified(),但你有 2 个 stage.isIconified()

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

它应该是

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