J'essaye d'écrire une méthode simple pour basculer si ma fenêtre est minimisée (c'est-à-dire iconifiée). Je reçois un comportement étrange. Voici un code exécutable qui illustre le problème.Stage.setIconified() et Stage.isIconified() n'agissent pas correctement
Je reçois les mêmes résultats sur Gnome 3.20.4 et XFCE 4.12. Je n'ai pas encore testé cela dans un autre environnement.
- Si la fenêtre est pas agrandie, le code fonctionne comme prévu, mais l'état signalé est incorrect parfois. Voici la sortie du code ci-dessous. J'ai mis des notes (
<--
) à côté des lignes où la sortie textuelle ne correspond pas à la sortie visuelle.
Windows ne maximisée Comportement
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
- Si la fenêtre est agrandie, le code ne fonctionne pas comme prévu. Au lieu de cela, il s'agit d'un processus en trois étapes. Le premier appel symbolise, le deuxième appel est restauré et le troisième appel n'effectue aucun changement visuel.
de Windows maximisée Comportement
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
...
Voici le code runnable:
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();
}
}