У меня проблема с Swing, которая возникает только тогда, когда монитор компьютера выключен, но мое приложение Swing продолжает работать в фоновом режиме.Кажется, что когда монитор выключен, Swing / AWT отменяет все операции рисования, что приводит к ряду проблем с отображением в графическом интерфейсе, которые видны, как только монитор снова включается.
Например, когда яВыключите монитор с помощью пользовательской функции JNI, а затем откройте простое диалоговое окно сообщения. При повторном включении монитора диалоговое окно будет пустым:
![Blank message dialog](https://i.stack.imgur.com/lpDsH.png)
Но после правильнойследующий перекрас:
![Correctly painted message dialog](https://i.stack.imgur.com/pXXx3.png)
Это ожидаемое поведение Swing?Есть ли способ указать Swing продолжать рисование на экране, даже если монитор выключен?
РЕДАКТИРОВАТЬ: Вот SSCCE:
package test;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class App {
public static void main(String[] args) throws Throwable {
System.out.println("***** Please turn off the monitor in the next 70 seconds *****");
Thread.sleep(1000L * 70);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Test");
}
});
}
}
IЯ использую 64-битную Windows 7 Home Premium SP1 и 64-битную Java 1.6.0_24.
РЕДАКТИРОВАТЬ 2: Вот еще одна программа, с которой я испытываю эффект «отмененных операций рисования»:
package test;
import static com.mycompany.Util.turnOffMonitors;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class DialogTest extends JDialog {
private final JLabel label;
public DialogTest() {
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
label = new JLabel("Test", JLabel.CENTER);
label.setOpaque(true);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(BorderLayout.CENTER, label);
this.setPreferredSize(new Dimension(200, 110));
pack();
setLocationRelativeTo(null);
setVisible(true);
Thread t = new Thread() {
@Override
public void run() {
turnOffMonitors();
try {
Thread.sleep(3000L);
} catch (InterruptedException ex) { }
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setBackground(Color.YELLOW);
}
});
}
};
t.start();
}
public static void main(String[] args) throws Throwable {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DialogTest();
}
});
}
}
Перед выключением монитора я вижу:
![Screenshot of the dialog of DialogTest before the monitor shuts off](https://i.stack.imgur.com/huB2h.png)
При выключенном мониторе цвет фона метки меняется на желтый в качестве фона,Затем я перемещаю мышь, чтобы снова включить монитор.Диалог визуально не изменился.Только после того, как я принудительно перекрасил (например, с помощью ALT-TABbing), я вижу желтый:
![Screenshot of the dialog of DialogTest where the main label has a yellow background](https://i.stack.imgur.com/WzDVp.png)
РЕДАКТИРОВАТЬ 3: Сообщено в Oracleкак Ошибка ID 7049597 .