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.