Saltar al contenido

Dibujar un objeto usando getGraphics() sin extender JFrame

Luego de de esta prolongada compilación de datos dimos con la respuesta esta duda que pueden tener ciertos los lectores. Te brindamos la solución y deseamos serte de mucha ayuda.

Solución:

Si desea cambiar la forma en que se dibuja su componente (está agregando rectángulos), debe redefinir paintComponent() en ese componente. En tu código, estás usando getGraphics().

no deberías llamar getGraphics() en un componente. Cualquier pintura que hagas (al Graphics devuelto) será temporal y se perderá la próxima vez que Swing determine que es necesario volver a pintar un componente.

En su lugar, debe anular el paintComponent(Graphics) método (de la JComponent o JPanel), y pinte con este método, usando el Graphics objeto recibido como argumento.

Consulte este enlace para leer más.

A continuación se muestra su código, corregido.

import javax.swing.*;
import java.awt.*;

public class Main 
    public static void main(String[] args) 
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new JPanel() 
            @Override
            public void paintComponent(Graphics g) 
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(0, 0, 100, 100);
            
        ;
        frame.add(panel);

        // Graphics g = panel.getGraphics();
        // g.setColor(Color.BLUE);
        // g.fillRect(0, 0, 100, 100);

        frame.validate(); // because you added panel after setVisible was called
        frame.repaint(); // because you added panel after setVisible was called
    

Otra versión, ¿la exactamente lo mismopero puede ser más claro para usted:

import javax.swing.*;
import java.awt.*;

public class Main 
    public static void main(String[] args) 
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new MyRectangleJPanel(); // changed this line
        frame.add(panel);

        // Graphics g = panel.getGraphics();
        // g.setColor(Color.BLUE);
        // g.fillRect(0, 0, 100, 100);

        frame.validate(); // because you added panel after setVisible was called
        frame.repaint(); // because you added panel after setVisible was called
    


/* A JPanel that overrides the paintComponent() method and draws a rectangle */
class MyRectangleJPanel extends JPanel 
    @Override
    public void paintComponent(Graphics g) 
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    

Debe anular el método paintComponent en la clase JPanel. Por lo tanto, debe crear una clase que amplíe JPanel y anule el método paintComponent en la subclase

java.awt.image.BufferedImage


¿Por qué no usar simplemente una instancia de java.awt.image.BufferedImage? p.ej

BufferedImage output = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = output.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, output.getWidth(), output.getHeight());
g2.setColor(Color.BLUE);
g2.fillRect(0, 0, 100, 100);

JOptionPane.showMessageDialog(null, new ImageIcon(output));

Al final de la artículo puedes encontrar las interpretaciones de otros desarrolladores, tú también eres capaz mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *