Swing y JFC: guía completa para interfaces gráficas en Java 21

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP