# Frage zu JPanel und Paint



## Fr3eMaN (2. Feb 2008)

N'abend

Ich beschäftige mich im Moment mit der Oberflächenprogrammierung unter Java mit Swing. Das ganze klappt auch sehr gut, doch komme ich im moment nicht weiter. Es geht um das bemahlen eines JPanels. Ich habe gelesen das man dafür die Methode Paint nutzen kann und diese überschreibt. Ich habe das ganze probiert, und es klappt für ein JFrame. Ich weis jetzt aber nicht wie ich das auf das JPanel anwenden kann. Hier mal etwas Code


```
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;

public class Main extends JFrame{

    public Main(){
        super("Testfenster");
        setSize(300,300);
        setJMenuBar(CreateMenu());
        add(CreatePanel());
        setVisible(true);  
    }
   
    public void paint(Graphics g){
       super.paint(g); 
       g.drawString("Hallo Welt", 30, 80); 
    }
    
    public JMenuBar CreateMenu(){
        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("File");
        JMenuItem menuitem = new JMenuItem("Beenden");
        menu.add(menuitem);
        menubar.add(menu);
        return menubar;
    }
    
    public JPanel CreatePanel(){
        JPanel panel = new JPanel();
        panel.setSize(300, 300);
        panel.setBackground(Color.GREEN);
        return panel;
    }
    
    public static void main(String[] args){
        Main m = new Main();  
        
    }
}
```

Ich habe es noch mit einer anderen herangehensweise probiert, indem ich die Klasse nicht auf das JFrame sondern auf das JPanel bezogen habe (extends JPanel), doch dann stimmt glaub ich die ganze herangehensweise nicht. Wie schaffe ich es das ich auf das Panel zeichne.
Danke euch


----------



## *Hendrik (2. Feb 2008)

Indem Du paintComponent() überschreibst und nicht paint().


----------



## anfänger15 (2. Feb 2008)

bei JFrame und allen lightwhite Komponenten von Swing musst du paintComponent überschreiben

//edit: *Hendrik war schneller


----------



## Quaxli (3. Feb 2008)

Grundsätzlich funktioniert auch das Überschreiben der paint-Methode. Richtiger ist natürlich das Überschreiben der paintComponent-Methode. Die Lösung für die gestellte Frage ist es nicht!

Zur eigentlichen Frage:



> Ich habe das ganze probiert, und es klappt für ein JFrame. Ich weis jetzt aber nicht wie ich das auf das JPanel anwenden kann.



Im Prinzip ganz genauso, wie Du das oben gelöst hast, nur daß Deine Klasse von JPanel erben muß, damit Du dort die paintComponent-Methode überschreiben kannst. Etwa so:


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


public class Test extends JPanel {

	public static void main(String[] args) {
   new Test();
	}
	
	public Test(){
		JFrame frame = new JFrame("Demo");
		frame.setLocation(100,100);
		frame.setSize(200,200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.setVisible(true);
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.red);
		g.fillOval(0, 0, getWidth(), getHeight());
	}

	
	
}
```


----------



## Fr3eMaN (3. Feb 2008)

danke euch erstmal, aber trotzdem habe ich zum letzten Beitrag(@Quaxli) eine Frage. Also du erstellst ein JFrame und die hauptklasse erbt die Methoden der JPanel Klasse. Soweit ist alles klar, die paintComponent Methode wird also auf die Hauptklasse (JPanel) angewandt, obwohl nirgens ein JPanel erstellt wurde? . 

edit: wird durch die add(this) Methode das JPanel hinzugefügt?


----------



## anfänger15 (3. Feb 2008)

ja durch add(this) wird das JPanel (die Klasse Test) dem Frame hinzugefügt.

Da Test von JPanel erbt ist es ein JPanel und durch new Test() in der main wird ein Test-Objekt erstellt. Da Test von JPanel erbt wird also ein JPanel erstellt.


----------

