repintado () en Java

Posible duplicado:
Problema de repintado de Java GUI ()?

Escribo un código Java, pero tengo un problema con la GUI. Cuando agrego un componente al objeto JFrame, llamo al método repaint () para actualizar la GUI pero no funciona. Pero cuando minimizo o cambio el tamaño de este marco, la GUI se actualiza.

Aquí está mi código:

public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(460, 500); frame.setTitle("Circles generator"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); String input = JOptionPane.showInputDialog("Enter n:"); int n = Integer.parseInt(input); CircleComponent component = new CircleComponent(n); frame.add(component); component.repaint(); } 

Si agregó JComponent a un contenedor ya visible, entonces tiene una llamada

 frame.getContentPane().validate(); frame.getContentPane().repaint(); 

por ejemplo

 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; public class Main { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(460, 500); frame.setTitle("Circles generator"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SwingUtilities.invokeLater(new Runnable() { public void run() { frame.setVisible(true); } }); String input = JOptionPane.showInputDialog("Enter n:"); CustomComponents0 component = new CustomComponents0(); frame.add(component); frame.getContentPane().validate(); frame.getContentPane().repaint(); } static class CustomComponents0 extends JLabel { private static final long serialVersionUID = 1L; @Override public Dimension getMinimumSize() { return new Dimension(200, 100); } @Override public Dimension getPreferredSize() { return new Dimension(300, 200); } @Override public void paintComponent(Graphics g) { int margin = 10; Dimension dim = getSize(); super.paintComponent(g); g.setColor(Color.red); g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); } } } 

Simplemente escribe:

 frame.validate(); frame.repaint(); 

Que hará .

Saludos

Estás haciendo las cosas en el orden equivocado.

Primero debe agregar todos los JComponents al JFrame, y solo luego llame a pack() y luego setVisible(true) en el JFrame.

Si posteriormente agregó JComponents que podrían cambiar el tamaño de la GUI, deberá volver a llamar a pack() y volver a repaint() en JFrame después de hacerlo.

Es posible que deba llamar también a frame.repaint() para forzar que el marco se frame.repaint() a dibujar. Tuve problemas antes de intentar volver a pintar un componente y no estaba actualizando lo que se mostraba hasta que se llamó al método repainting () de los padres.