8
我想寫一個簡單的方法來切換我的窗口是否最小化(即圖標化)。我越來越奇怪的行爲。下面是說明問題的可運行代碼。Stage.setIconified()和Stage.isIconified()不能正常工作
我在Gnome 3.20.4和XFCE 4.12上得到了相同的結果。我還沒有在任何其他環境中測試過這個。
- 如果沒有最大化窗口,代碼工作正常,但報告的狀態是在次不正確。以下是代碼的輸出。我已將筆記(
<--
)放在文本輸出與視覺輸出不匹配的行旁邊。
視窗未最大化行爲
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();
}
}