Para gráficos a medida —diagramas, gráficas, juegos, visualizadores— se extiende JPanel y se sobreescribe el método paintComponent(Graphics g).
public class PanelGrafico extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // IMPORTANTE: llamar siempre primero
Graphics2D g2 = (Graphics2D) g;
// Anti-aliasing para líneas y texto suavizados
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
int w = getWidth(), h = getHeight();
// Fondo degradado
GradientPaint fondo = new GradientPaint(0, 0, Color.WHITE, 0, h, new Color(230, 240, 255));
g2.setPaint(fondo);
g2.fillRect(0, 0, w, h);
// Rectángulo con borde
g2.setColor(new Color(0, 120, 215));
g2.setStroke(new BasicStroke(2f));
g2.drawRect(50, 50, 200, 100);
// Elipse rellena
g2.setColor(new Color(255, 165, 0, 180)); // naranja semitransparente
g2.fillOval(80, 80, 120, 60);
// Texto con fuente personalizada
g2.setColor(Color.DARK_GRAY);
g2.setFont(new Font("SansSerif", Font.BOLD, 16));
g2.drawString("Gráfico personalizado", 60, 180);
// Línea de datos simulada
g2.setColor(Color.RED);
g2.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
int[] xs = {100, 150, 200, 250, 300};
int[] ys = {200, 150, 180, 120, 160};
for (int i = 1; i < xs.length; i++) {
g2.drawLine(xs[i-1], ys[i-1], xs[i], ys[i]);
}
}
}
Forzar repintado
// Para animar o actualizar el gráfico panel.repaint(); // programa un repintado en el EDT // Con Timer para animaciones Timer animacion = new Timer(16, e -> panel.repaint()); // ~60 FPS animacion.start();
Cargar y mostrar imágenes
// Desde archivo
BufferedImage img = ImageIO.read(new File("foto.jpg"));
g2.drawImage(img, 10, 10, null);
// Escalada
g2.drawImage(img, 10, 10, 200, 150, null);
// Desde resources del JAR
BufferedImage img = ImageIO.read(getClass().getResourceAsStream("/images/logo.png"));
// Con JLabel (más simple para mostrar sin pintar)
JLabel lblImg = new JLabel(new ImageIcon(img));
