[JAVA ] Tengo un problema que no he podido solucionar, la idea es agregar varias pelotas a un JPanel que esta sobre un Jframe, y hacer que se muevan simultáneamente, pero el problema es que tengo que usar threads(hilos), uno para cada pelota. y dibujarlos en el JPanel. Alguien me puede ayudar. Gracias
Un hilo por pelota es justo el camino que suele acabar mal en Swing. Swing no es thread-safe: si tocas componentes o llamas a repaint() desde hilos que no son el Event Dispatch Thread (EDT), tarde o temprano tienes parpadeos, dibujos a medias o excepciones raras que no se reproducen siempre igual.
Para animar varios objetos a la vez en un JPanel no hace falta ni un solo Thread manual. Con un único javax.swing.Timer te sobra:
Timer timer = new Timer(16, e -> { // ~60 fps
for (Pelota p : pelotas) {
p.mover();
}
panel.repaint();
});
timer.start();
Lo importante es que el listener del Timer de Swing se ejecuta siempre en el EDT, así que puedes actualizar posiciones y pedir repaint() sin preocuparte de sincronización. Cada pelota es simplemente un objeto con su posición y velocidad, guardado en una lista; el método mover() actualiza x e y, y el paintComponent() del panel recorre la lista y dibuja cada una.
Si en algún momento necesitas cálculos pesados (física más compleja, colisiones entre muchos objetos), eso sí puede ir en un hilo aparte, pero el resultado siempre se aplica a la UI a través de SwingUtilities.invokeLater(), nunca tocando el panel directamente desde ese hilo.
David