2D-Grafik BufferedImage wird nicht eingezeichnet

Anlex

Mitglied
Ich will ein abgewandeltes JPanel und darunter einen Button in einem JFrame platzieren. Im Panel will ich was einzeichnen lassen. Dazu habe ich folgende Testklasse geschrieben:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class WindowTest1 extends JFrame {

    CPanel panel1;
    JButton button1;
    BufferedImage img;

    public WindowTest1 () {
        this.setLayout(null);
        this.setSize(300, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);

        panel1 = new CPanel();
        this.getContentPane().add(panel1);
        panel1.setLayout(null);
        panel1.setBackground(Color.WHITE);
        panel1.setBounds(50, 50, 200, 300);

        img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = img.createGraphics();
        g2.setPaint(Color.WHITE);
        g2.fillRect(0,0, img.getWidth(), img.getHeight());
        g2.setPaint(Color.RED);
        g2.drawLine(0,0,100,100);
        panel1.paintComponent(g2);
        
        button1 = new JButton("ClickMe");
        this.getContentPane().add(button1);
        button1.setBounds(50, 400, 100, 50);
        
        this.setVisible(true);
    }

    public class CPanel extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D)g;
            g2.drawImage(img, 50, 50, img.getWidth(), img.getHeight(), Color.WHITE, null);
        }
    }
    
    public static void main (String[] args) {
        new WindowTest1();
    }
}

Beim Ausführen zeigen sich zwar das Panel und der Button, aber irgendwie wird das Image nicht eingezeichnet. Hat jemand ne Idee, woran es liegt? Danke schonmal.
 
aber irgendwie wird das Image nicht eingezeichnet. Hat jemand ne Idee, woran es liegt?

Lasse mal Zeile 33 ( panel1.paintComponent(g2); ) weg. paintComponent wird automatisch aufgerufen, das ruft man nicht direkt auf! Falls man den Code doch mal ausführen will der dahinter steckt,(also neuzeichnen will) ruft man eher repaint() auf!
 
Noch einige Verbesserungen...

Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class WindowTest1 extends JFrame {

    private CPanel panel1;
    private JButton button1;
    private BufferedImage img;

    public WindowTest1 () {
        //this.setLayout(null); //NUllLayout ist böse, erlerne LayoutManager!
        this.setSize(300, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationByPlatform(true);
        this.setResizable(false);

        panel1 = new CPanel();
        //this.getContentPane().add(panel1);
        //panel1.setLayout(null);
        panel1.setBackground(Color.WHITE);
        //panel1.setBounds(50, 50, 200, 300);
        add(panel1);

        img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
        /*Graphics2D g2 = img.createGraphics();
        g2.setPaint(Color.WHITE); //Zeichenanweisungen gehören immer in eine paintComponent()-Methode
        g2.fillRect(0,0, img.getWidth(), img.getHeight());
        g2.setPaint(Color.RED);
        g2.drawLine(0,0,100,100);
        panel1.paintComponent(g2);*/ //Diese Zeile wird niemals gebraucht!

        button1 = new JButton("ClickMe");
        //this.getContentPane().add(button1);
        //button1.setBounds(50, 400, 100, 50);
        JPanel buttonPanel = new JPanel(); //Hilfs-Panel für Buttons
        buttonPanel.add(button1);
        add(buttonPanel, BorderLayout.SOUTH);

        this.setVisible(true);
    }

    public class CPanel extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D)g;
            
            //g2.setPaint(Color.WHITE); //mal auskommentiert, sonst ist es unsichtbar
            g2.fillRect(0,0, img.getWidth(), img.getHeight());
            g2.setPaint(Color.RED);
            g2.drawLine(0,0,100,100);
            g2.drawImage(img, 50, 50, img.getWidth(), img.getHeight(), Color.WHITE, null);
        }
    }

    public static void main (String[] args) {
        new WindowTest1();
    }
}
 

Zurück
Oben