Zeichnen eines Objekts mit getGraphics (), ohne JFrame zu erweitern

Wie zeichne ich ein Objekt ohne eine class (die JFrame )? Ich getGraphics Methode getGraphics gefunden, aber sie zeichnet das Objekt nicht.

 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(); frame.add(panel); Graphics g = panel.getGraphics(); g.setColor(Color.BLUE); g.fillRect(0, 0, 100, 100); } } 

   

Wenn Sie die Art ändern möchten, in der Ihre Komponente gezeichnet wird (Sie fügen Rechtecke hinzu), müssen Sie paintComponent() in dieser Komponente neu definieren. In Ihrem Code verwenden Sie getGraphics() .

Sie sollten getGraphics() für eine Komponente aufrufen. Jedes Bild, das du machst (zu der Graphics zurückgegeben wird) ist temporär und wird beim nächsten Mal verloren sein, wenn Swing feststellt, dass eine Komponente neugemalt werden muss.

Stattdessen sollten Sie die paintComponent(Graphics) -Methode (der JComponent oder JPanel ) außer Kraft setzen und das paintComponent(Graphics) in dieser Methode unter Verwendung des als Argument empfangenen Graphics Objekts durchführen.

Überprüfen Sie diesen Link für weitere Lektüre.

Unten ist dein Code korrigiert.

 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 } } 

Eine andere Version, die genau dasselbe tut , könnte Ihnen aber klarer sein:

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

Sie müssen die paintComponent-Methode in der JPanel-class überschreiben. Sie sollten also eine class erstellen, die JPanel erweitert und die paintComponent-Methode in der Unterklasse überschreibt

java.awt.image.BufferedImage


Warum nicht einfach eine Instanz von java.awt.image.BufferedImage ? z.B

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