# paint(Graphics g) im BorderLayout einem JPanel zuordnen &amp



## jaggi12 (16. Mrz 2005)

Hallo!

ich hab eine Frage bezüglich der paint(Graphics g) Methode. Und zwar hab ich mir einen 

Frame erstellt und diesem ein BorderLayout gemacht. In jedem bereich des BorderLayouts 

(aslo Center, North, South....) befindet sich ein JPanel. Da ich den Frame ganz flexibel 

gestallten will bzw. die einzelnen Elemente auch noch verschoben werden sollen. Möchte ich 

die ELemente, die ich mir mit Paint erstellt habe in ein Panel setzen und nicht direkt in 

den Frame rein. 

In etwa soll es so ausschauen, ich geb mal ein Beispiel:

```
....

JComponent jc = (JComponent)getContentPane();
...


 void initLayout()
    {
	 jc.setLayout( new BorderLayout( ) );

         JPanel southPnl = new JPanel();
         JLabel label1 = new JLabel("Mal sehen");
         southPnl.add(label1);
         jc.add("South", southPanel);

         JPanel eastPnl = new JPanel();
         eastPnl.add(// hier soll nun das erste Element der Paintsachen geaddet werden,     

                 //  also g.drawString(bildeins,35,190));

  public void paint(Graphics g)
    {
        g.setColor(Color.blue);
        
        g.drawString(bildeins,35,190);
        g.drawString(bildzwei,115,190);
        g.drawString(labeldrei,195,190);
        g.drawString(stringvier,275,190);
        g.drawString(zahlfuenf,355,190);
    }
```

Wie bekomm ich das denn hin? Dass das so klappt?


----------



## dotlens (16. Mrz 2005)

warum arbeitest du mit drawString und fügst den Paneln nicht einfach JLabels hinzu??
Ansonsten verwende getGraphics() von JPanel, um das passende Graphics Objekt zu bekommen.


----------



## jaggi12 (16. Mrz 2005)

na gut ich geb zu, das Beispiel ist nicht so passend, 
dann möcht ich halt das hier in das JPanel adden


```
...
g.setColor(Color.BLUE);            
    for(int i=0; i<10; i++)
     {
        g.fillRoundRect(50+110*i,60,80,80,11,11);
      }
...
```


----------



## dotlens (16. Mrz 2005)

dotlens hat gesagt.:
			
		

> verwende getGraphics() von JPanel, um das passende Graphics Objekt zu bekommen.




```
JPanel panel1 = new JPanel();
Grahpics g1 = panel1.getGraphics();
for(int i=0; i<10; i++){
   g1.fillRoundRect(50+110*i,60,80,80,11,11);
}
```


----------



## jaggi12 (16. Mrz 2005)

Hi, und wie würde das dann genau aussehen, wenn getGraphics() von JPanel nehme? 
Mach ich das dann so?


```
void initLayout() 
    { 
    jc.setLayout( new BorderLayout( ) ); 

         JPanel southPnl = new JPanel(); 
         JLabel label1 = new JLabel("Mal sehen"); 
         southPnl.add(label1); 
         jc.add("South", southPanel); 

         JPanel eastPnl = new JPanel(); 

}

 public void paint(Graphics g) 
    { 
        g.setColor(Color.blue); 
        
        for(int i=0; i<10; i++) 
     { 
        g.fillRoundRect(50+110*i,60,80,80,11,11); 
      } 

public Graphics getGraphics()
    {
	return ??? // wie greif ich da auf mein paint zu?
    }


    }
```


----------



## dotlens (16. Mrz 2005)

Eher so:

```
void initLayout() 
    { 
    jc.setLayout( new BorderLayout( ) ); 

         JPanel southPnl = new JPanel(); 
         JLabel label1 = new JLabel("Mal sehen"); 
         southPnl.add(label1); 
         jc.add("South", southPanel); 

         JPanel eastPnl = new JPanel(); 

         Graphics g = southPnl.getGraphics();
         g.setColor(Color.blue); 
        
         for(int i=0; i<10; i++) { 
             g.fillRoundRect(50+110*i,60,80,80,11,11); 
         } 
}
```
Jetzt zeichnet er alles in den southPanel, wenn du noch irgendwo ander zeichnen möchtest musst du das Graphics Objekt von diesem Panel auch verwenden...


----------



## jaggi12 (16. Mrz 2005)

> ...
> JPanel panel1 = new JPanel();
> Grahpics g1 = panel1.getGraphics();
> for(int i=0; i<10; i++){
> ...



okay, ich hab es jetzt so gemacht, 

somit schaut bei mir der code nun so aus:


```
.... 

JComponent jc = (JComponent)getContentPane(); 
... 


void initLayout() 
    { 
    jc.setLayout( new BorderLayout( ) ); 

         JPanel southPnl = new JPanel(); 
         JLabel label1 = new JLabel("Mal sehen"); 
         southPnl.add(label1); 
         jc.add("South", southPanel); 

         JPanel panel1 = new JPanel(); 
Grahpics g1 = panel1.getGraphics(); 
for(int i=0; i<10; i++)
{ 
   g1.fillRoundRect(50+110*i,60,80,80,11,11); 
}


jc.add("East", panel1);

}

public void paint(Graphics g)
    {
        g.setColor(Color.BLUE);           
        for(int i=0; i<5; i++)
        {
            g.fillRoundRect(35+80*i,305,60,60,7,7);
        }
}

// so sieht jetzt das gesamte gebilde aus, warum krieg ich jetzt noch ne NulPointerException? Hab ich was vergessen, oder falsch gemacht?
```


----------



## jaggi12 (16. Mrz 2005)

> void initLayout()
> {
> jc.setLayout( new BorderLayout( ) );
> 
> ...




die Exception bleibt, muss ich noch irgendwas an der public paint (Graphics g) machen


----------



## dotlens (16. Mrz 2005)

ja löschen....


----------



## jaggi12 (16. Mrz 2005)

okay, jetzt hier mal der ganze Beispielcode, lässt sich ausführen, habs auch schon ohne diese getGraphics versucht, woran liegt es denn dann jetzt?


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class ab extends JFrame
{
	private JComponent jc = (JComponent)getContentPane();
	ab()
	{
	    super();
	        setTitle("Test");
	        setSize(800, 478);        
	        setForeground(Color.blue);
	        setBackground(Color.white);  
	        initLayout();
	        setLocationRelativeTo(null);
	        setVisible(true);
	        setResizable(true);        
	    }

void initLayout() 
{ 
jc.setLayout( new BorderLayout( ) ); 

     JPanel southPnl = new JPanel(); 
     JLabel label1 = new JLabel("Mal sehen"); 
     southPnl.add(label1); 
     jc.add("South", southPnl); 

     JPanel eastPnl = new JPanel(); 

     Graphics g = eastPnl.getGraphics(); 
     g.setColor(Color.blue); 
    
     for(int i=0; i<10; i++) { 
         g.fillRoundRect(50+110*i,60,80,80,11,11); 
     } 
     jc.add("East", eastPnl);
}



public static void main(String[] args) {
	ab frame = new ab();
	frame.setSize(800, 300);
	frame.setLocationRelativeTo(null);
	frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
	frame.setVisible(true);
}
}
```


----------



## dotlens (16. Mrz 2005)

erstmal: Klassen schreibt man gross

also ich verstehe gerade nicht wieso getGraphics() null zurück liefert. Steh heute aber so oser so aufm schlauch. 
Kannst aber auch eigene Klassen schreiben, welche von JPanel erben, und in diesen die paintComponent(Graphics g) methode überschreiben. Dann kannst du das entsprechende Graphics Objekt verwenden.


----------



## jaggi12 (16. Mrz 2005)

okay, dann schreib ich die klasse mal lieber groß....

gut mhm, ich kann mir nicht wirklich vorstellen geschweige denn umsetzen was du meinst... ich soll also, mir nen JPanel erstellen davon ein neues erstellen und dann irgendwie paintComponent(Graphics g) überschreiben, oder ?


----------



## dotlens (16. Mrz 2005)

Klasse:

```
class meinPanel extends JPanel {

	protected void paintComponent(Graphics g) {
		g.setColor(Color.blue);

		for (int i = 0; i < 10; i++) {
			g.fillRoundRect(50 + 110 * i, 60, 80, 80, 11, 11);
		}
	}
}
```
instanzieren:

```
this.getContentPane().add(new meinPanel());
```


----------



## jaggi12 (16. Mrz 2005)

okay danke jetzt hab ich es so gemacht,


```
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Test extends JFrame
{
	private JComponent jc = (JComponent)getContentPane();
	Test()
	{
	    super();
	        setTitle("Test");
	        setSize(800, 478);        
	        setForeground(Color.blue);
	        setBackground(Color.white);  
	        initLayout();
	        setLocationRelativeTo(null);
	        setVisible(true);
	        setResizable(true);        
	    }

void initLayout() 
{ 
jc.setLayout( new BorderLayout( ) ); 

     JPanel northPnl = new JPanel(); 
     JLabel label1 = new JLabel("Mal sehen"); 
     southPnl.add(label1); 
     jc.add("North", northPnl); 

     JPanel eastPnl = new JPanel(); 
     
     jc.add("South", this.getContentPane().add(new myPanel()));
}

public static void main(String[] args) {
	Test frame = new test();
	frame.setSize(800, 300);
	frame.setLocationRelativeTo(null);
	frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
	frame.setVisible(true);
}
}
```


```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

class myPanel extends JPanel {


	   protected void paintComponent(Graphics g) 
	   {   
        g.setColor(Color.blue);           
        for(int i=0; i<5; i++)
        {
            g.fillRoundRect(35+80*i,35,60,60,7,7);
        }
        
        g.setColor(Color.green);            
        for(int i=0; i<5; i++)
        {
            g.drawRoundRect(35+80*i,35,60,60,7,7);
        }
```

der malt da einfach nichts....


----------



## Wildcard (16. Mrz 2005)

Dein Panel hat auch noch keine Größe


----------



## jaggi12 (16. Mrz 2005)

aber ich sag doch in der Testklasse, das es in den South gelegt  werden soll, wieso macht er es denn dann nicht schon automatisch? 

also soll ich im mypanel jetzt so etwas noch einfügen, ja?

mypanel.setSize(x,y);


----------



## Wildcard (16. Mrz 2005)

Wenn du einen Layoutmanager verwendest musst du über setPreferreredSize gehen.
Die ist bei MyPanel natürlich 0, da ja keine Komponenten eingefügt wurden.
Weil du in diesem Panel nur zeichnest überschreib am besten die getPreferredSize() Methode, und lass
sie den Wert zurückgeben den du möchtest.


----------



## jaggi12 (16. Mrz 2005)

also hier an der Stelle, ja?


```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class myPanel extends JPanel {
	  void getPreferredSize()
	{
		return 200, 100; 
	}

	   protected void paintComponent(Graphics g) 
	   {
 
        
        g.setColor(Color.blue);            // Weiße Würfelflächen
        for(int i=0; i<5; i++)
        {
            g.fillRoundRect(35+80*i,35,60,60,7,7);
        }
        
        g.setColor(Color.green);            
        for(int i=0; i<5; i++)
        {
            g.drawRoundRect(35+80*i,35,60,60,7,7);
        }
   }
}
```

so oder wie?


----------



## Wildcard (16. Mrz 2005)

Wo ist egal, aber das ist Blödsinn:

```
void getPreferredSize() 
   { 
      return 200, 100; 
   }
```


```
public Dimension getPreferredSize()
{
      return new Dimension(200,100);
}
```


----------



## jaggi12 (16. Mrz 2005)

hey danke, jetzt hat es funktioniert, klasse!!!!


----------

