sirve rombo que para ejemplo drawline dibujos dibujar java swing awt repaint

rombo - paintcomponent java



¿AWT/Swing cancela las operaciones de pintura si el monitor está apagado? (2)

Tengo un problema con Swing que solo ocurre cuando el monitor de la computadora está apagado, pero mi aplicación Swing continúa ejecutándose en segundo plano. Parece que cada vez que el monitor está apagado, Swing / AWT cancela todas las operaciones de pintura, lo que da lugar a una serie de problemas de visualización en la GUI que son visibles tan pronto como el monitor se vuelve a encender.

Por ejemplo, cuando apago el monitor usando una función JNI personalizada y luego abro un diálogo de mensaje simple, el diálogo de mensaje está en blanco cuando el monitor se vuelve a encender:

Pero pinta correctamente después de la próxima repintación:

¿Es este el comportamiento esperado de Swing? ¿Hay alguna manera de indicarle a Swing que siga dibujando en la pantalla incluso si el monitor está apagado?

EDITAR: Aquí hay un 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"); } }); } }

Estoy usando Windows 7 Home Premium SP1 de 64 bits y Java 1.6.0_24 de 64 bits.

EDIT 2: Aquí hay otro programa con el que experimento el efecto de "operaciones de pintura canceladas":

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

Antes de que el monitor se apague, veo:

Con el monitor apagado, el color de fondo de la etiqueta cambia a amarillo en el fondo. Luego muevo el mouse para volver a encender el monitor. El diálogo no se modifica visualmente. Solo después de forzar el repintado (mediante ALT-TABbing, por ejemplo) veo el amarillo:

EDIT 3: Reportado a Oracle como ID de error 7049597 .


Luego comencé el programa y dejé de mover el mouse / tipeo. Después de un minuto, la pantalla se apagó. Esperé otros 20 segundos para mover el mouse. El monitor se volvió a encender y vi un cuadro de diálogo de mensaje en blanco.

Usando su ejemplo, no veo esto en mi plataforma (que no sea de Windows). Puede probar el siguiente ejemplo, que debe alternar entre WINDOW_ACTIVATED en wake y WINDOW_DEACTIVATED en suspensión. Si es así, podría extender JDialog y JDialog repaint() en windowActivated() .

import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; /** @see http://.com/questions/6163606 */ public class DialogEventTest extends JDialog { public DialogEventTest() { this.setLayout(new GridLayout(0, 1)); this.add(new JLabel("Dialog event test.", JLabel.CENTER)); this.add(new JButton(new AbstractAction("Close") { @Override public void actionPerformed(ActionEvent e) { DialogEventTest.this.setVisible(false); DialogEventTest.this.dispatchEvent(new WindowEvent( DialogEventTest.this, WindowEvent.WINDOW_CLOSING)); } })); } private static class WindowHandler extends WindowAdapter { @Override public void windowActivated(WindowEvent e) { System.out.println(e); } @Override public void windowDeactivated(WindowEvent e) { System.out.println(e); } } private void display() { this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); this.addWindowListener(new WindowHandler()); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new DialogEventTest().display(); } }); } }


El problema probablemente tiene más que ver con cómo se vuelve a pintar cuando se enciende la pantalla en lugar de con lo que sucede mientras está apagado. Puede verificar ejecutando un grabador de pantalla.