у нас есть проблемы с приложениями Java 6, которые не обновляются должным образом при переключении виртуальных рабочих столов. До сих пор эта проблема воспроизводилась на Fedora 11 и 13 с GNOME и Suse SLES 10 с KDE. Я использую следующий контрольный пример для воспроизведения проблемы:
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();
}
});
}
}
Запустите эту программу и переместите другое окно, например, окно терминала, частично перед ним. Подождите, пока фон окна станет красным, переключитесь на другой виртуальный рабочий стол и подождите пять секунд, затем вернитесь к исходному экрану. Фон теперь должен быть полностью зеленым. Вместо этого я получаю окно, которое только частично обновляется в видимых частях, не охватываемых другим окном.
Эта проблема не возникает в Java 5 и не возникает при использовании одного из следующих свойств при запуске:
-Dswing.handleTopLevelPaint=false
или
-Dswing.bufferPerWindow=false
Однако отключение двойной буферизации Swing, похоже, не очень хороший вариант. Это ошибка JDK в Linux или мы можем что-то сделать в наших приложениях, чтобы исправить эту проблему перекраски?