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