Tengo un montón de botones en mi JToolBar, y configuré algunos de ellos para ser deshabilitados o habilitados dependiendo del estado de mi aplicación. Cuando actualizo varios botones a la vez, descubro que no están repintados al mismo tiempo. Quiero asegurarme de que cuando configure un número de botones para que sean deshabilitados/habilitados, todos cambien de estado al mismo tiempo.¿Puedo agregar algunas actualizaciones de componentes de Swing para que las reparaciones se hagan todas a la vez?
A continuación se muestra una pequeña prueba que demuestra el problema. (Necesita un archivo a.png en el directorio actual para usar como un ícono de botón.) Cuando lo ejecuta, se muestra una barra de herramientas con 10 botones. Presionar Enter en la terminal alternará el estado desactivado de todos los botones. En mi máquina al menos, cada vez que hago esto, los botones se repintan en un orden aparentemente aleatorio, y no todos a la vez.
Parece que el doble buffer podría resolver el problema, aunque lo primero que intenté (configurar doble buffering en el JToolBar) no pareció afectar nada.
Gracias,
Cameron
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class Test {
public static void main(String[] args) throws IOException {
final JButton[] bs = new JButton[10];
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame("test");
JToolBar t = new JToolBar();
f.getContentPane().add(t);
for (int i = 0; i < bs.length; i++) {
bs[i] = new JButton(new ImageIcon("a.png"));
t.add(bs[i]);
}
f.pack();
f.setVisible(true);
}
});
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
for (;;) {
r.readLine();
EventQueue.invokeLater(new Runnable() {
public void run() {
for (JButton b : bs) {
b.setEnabled(!b.isEnabled());
}
}
});
}
}
}