Nous avons des problèmes avec les applications Java 6 qui ne s'actualisent pas correctement lors du changement de bureaux virtuels. Le problème jusqu'à présent a été reproduit sur Fedora 11 et 13 avec GNOME et Suse SLES 10 avec KDE. J'utilise le cas de test suivant pour reproduire le problème:Pourquoi un JFrame partiellement caché n'est pas correctement repeint sur Linux lors de la commutation entre les bureaux virtuels
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
public class RepaintTest {
private JLabel label;
private void createAndShowGUI() {
final JFrame frame = new JFrame("RepaintTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new JLabel("Repaint Test");
label.setOpaque(true);
frame.getContentPane().add(label);
frame.pack();
frame.setSize(200, 100);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
final RepaintTest repaintTest = new RepaintTest();
repaintTest.createAndShowGUI();
new Timer(5000, new ActionListener() {
boolean flip;
@Override
public void actionPerformed(ActionEvent e) {
repaintTest.label.setBackground(flip ? Color.GREEN : Color.RED);
flip = !flip;
}
}).start();
}
});
}
}
Démarrer ce programme et déplacer une autre fenêtre, par exemple, une fenêtre de terminal, en partie en face de celui-ci. Attendez que l'arrière-plan de la fenêtre devienne rouge, passez à un autre bureau virtuel et attendez cinq secondes, puis revenez à votre écran d'origine. L'arrière-plan devrait maintenant être complètement vert. Au lieu de cela, ce que je reçois est une fenêtre qui n'est que partiellement mise à jour dans les parties visibles non couvertes par l'autre fenêtre, voir screen shot.
Ce problème ne se produit pas avec Java 5 et il ne se produit pas lorsque vous utilisez l'une des propriétés suivantes au démarrage:
-Dswing.handleTopLevelPaint = false
ou
-Dswing.bufferPerWindow = false
Toutefois, la désactivation de la double mise en mémoire tampon de Swing ne semble pas être une très bonne option. Est-ce un bug JDK sur Linux ou pouvons-nous faire quelque chose dans nos applications pour résoudre ce problème de repeindre? Merci d'avance, Mark.
Dans un premier temps, l'extension de la classe JFrame est inutile dans votre cas, car vous ne l'utilisez pas. Pas sûr, mais cela pourrait aussi causer l'erreur Essayez juste de supprimer extends JFrame. –
La suppression de "extends JFrame" ne modifie pas le comportement. – Mark