# Swing Rechteck zeichnen



## Bernd1983 (6. Feb 2007)

hi, hab ein Problem ein Rechteck zu zeichnen


```
class Quad extends Figure {
    
    int x,y,w,h;


    

    
        Quad(int x,int y, int w, int h){
           super(x);
           this.y=y;
           this.w=w;
           this.h=h;
        }
        
        public void paintMe(Graphics g){
            g.drawRect(x,y,w,h);
            
        }
        
    
}
```

und swing:


```
class SwingDemo extends JFrame implements ActionListener{
    
    int a,b,c,d;
    Quad x;
  Graphics y;
  JButton green;
  
  SwingDemo(){
      
      getContentPane().setLayout(new FlowLayout());
      green=new JButton("rechteck?");
      green.addActionListener(this);
      getContentPane().add(green);
      x=new Quad(15,25,7,16);
  
  }
  public void actionPerformed(ActionEvent a){
      
      x.paintMe(y);
      
  }

}



public class DesignPattern {

    
    public static void main(String [] args){
       
    SwingDemo a=new SwingDemo();
    a.setSize(150, 100);
    a.setVisible( true );
    }
}
```


Ich bekomme eine NullPointerexception.Wieso? Wieso wird kein Rechteck gezeichnet?


grüsse


----------



## dieta (6. Feb 2007)

Poste mal mehr über die Fehlermeldeung (copy&paste).
In welcher Zeile bekommst du die Exception?


----------



## Lim_Dul (6. Feb 2007)

Da liegt aber einiges im argen:


```
class Quad extends Figure {
   
    int x,y,w,h;
```
Der Variablen x wird nie ein Wert zugewiesen, daher ist die immer 0.

[ocde]
      x.paintMe(y); 
[/code]
y ist immer null


----------



## WieselAc (6. Feb 2007)

ich glaub du bist etwas verrutscht 


Graphics y; dieses Y wird  nie initialisiert, das x auf das paint angewendet wird, wird mit new Quad initialisiert.

in der Quad Klasse selber bleibt das x zwar ohne explizite initialisierung ist aber standardmäßig 0.


----------



## Bernd1983 (6. Feb 2007)

hmm ok 

y ist nicht initialisiert.

aber wie intitialisiere ich dieses Graphic Objekt:

wenn ich ich im Konstruktor:

y=new Graphics() erzeuge

kann ich nicht übersetzen.

Was soll ich tun?


----------



## dieta (6. Feb 2007)

Zeichnen tut man normalerweise über die paint bzw. paintComponent-Methode:

```
class Quad extends Figure {
   
    int x,y,w,h;


   

   
        Quad(int x,int y, int w, int h){
           super(x);
           this.y=y;
           this.w=w;
           this.h=h;
        }
       
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawRect(x,y,w,h);
           
        }
       
   
}
```
Damit das funktioniert, muss die Klasse aber von z.B. JPanel erben. In diesem Fall wärst du am besten beraten, wenn du der Klasse "Figure" ein kleines extends JPanel bescheren würdest.
Dann kannst du das ganze per repaint() neu zeichnen und eben wie ein Panel zu deinem Fenster hinzufügen.

[edit]In den Foren-FAQs gibt's dazu glaube ich auch noch das ein oder andere Thema[/edit]


----------



## Bernd1983 (6. Feb 2007)

ja ok thx

hab jetzt meiner abstrakten Klassen ein extends JPanel gegeben und die paintComponent in der Klasse Quad implementiert. bekomme immer noch null pointer ex.


```
class SwingDemo extends JFrame implements ActionListener{
    
    
    Quad x;
    Graphics z;
 
  JButton green;
  
  SwingDemo(){
      
      getContentPane().setLayout(new FlowLayout());
      green=new JButton("rechteck?");
      green.addActionListener(this);
      getContentPane().add(green);
      x=new Quad(15,25,7,16);
      
  }
  public void actionPerformed(ActionEvent a){
      
      x.paintComponent(z);
      
  }
```

greets


----------



## dieta (6. Feb 2007)

Was für eine NullPonterEx denn? Poste mal, was dir der Compiler rauschmeißt (*copy&paste*).
Außerdem musst du x noch, da es je ein panel ist zu deinem Frame hinzufügen.
Und außerdem musst du statt

```
x.paintComponent(z);
```


```
x.repaint()
```
schreiben. Damit weist du die VM an, x bei Gelegenheit neu zu zeichnen.


----------



## Bernd1983 (6. Feb 2007)

hmm so jetzt versteh ich gar nix mehr. bin noch Anfänger im swing coden.



mein code ist jetzt so:


```
class Quad extends Figure{
    
    int x,y,w,h;


    

    
        Quad(int x,int y, int w, int h){
           super(x);
           this.y=y;
           this.w=w;
           this.h=h;
        }
        
        public void paintComponent(Graphics g){
         super.paintComponent(g);
            g.drawRect(x,y,w,h);
        }
        
    
}
```

und:


```
class SwingDemo extends JFrame implements ActionListener{
    
    int a,b,c,d;
    Quad x;
    Graphics z;
 
  JButton green;
  
  SwingDemo(){
      
      getContentPane().setLayout(new FlowLayout());
      green=new JButton("rechteck?");
      green.addActionListener(this);
      getContentPane().add(green);
      x=new Quad(15,25,7,16);
      
  }
  
 
  public void actionPerformed(ActionEvent a){
      
     x.repaint();
      
      
      
      
  }
```

Wenn ich auf denn Button drücke bekomme ich nichts....?????

Woran liegt das


----------



## dieta (6. Feb 2007)

Aaalso... 

```
super(x);
```
musst du durch

```
x=x;
```
ersetzen.

Hier:

```
SwingDemo(){
     
      getContentPane().setLayout(new FlowLayout());
      green=new JButton("rechteck?");
      green.addActionListener(this);
      getContentPane().add(green);
      x=new Quad(15,25,7,16);
     
  }
```
muss ans Ende noch 

```
add(x);
```
damit x auch deinem Fenster hinzugefügt wird.


----------



## Bernd1983 (6. Feb 2007)

ja thx.

jetzt wird mir ein quad gezeichnet ohne das ich denn button drücke.

Ich möchte aber den Button drücken und dann wird mir ein Rechteck gezeichnet.??

wie geht das

grüsse


----------



## WieselAc (6. Feb 2007)

Hier hast du mal ein kleines Beispiel:


```
public class Temp extends JPanel implements ActionListener {
    
    private boolean show;

    public Temp() {
        show = false;
        JButton b = new JButton("draw");
        b.addActionListener(this);
        add(b);
    }

    public void paint(Graphics g) {
        super.paint(g);
        if (show) {
            g.drawRect(50, 50, 50, 50);
        }
    }

    public void actionPerformed(ActionEvent arg0) {
        show = true;
        repaint();
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 400);
        frame.getContentPane().add(new Temp());
        frame.setVisible(true);
    }
}
```


----------



## Marco13 (6. Feb 2007)

@dieta: Sorry, so eine Klasse von JPanel erben zu lassen ist grober Unfug. Und dass eine Zeile wie
x=x;
keinen Sinn macht, sollte eigentlich jedem einleuchten. 
(Warum ich nicht Sänger geworden bin? Ganz einfach: Weil ich nicht singen kann)

@Bernd1983: Ein Kleines, selbstständiges, kompilierbares Beispiel, in dem der Fehler auftritt, ist häufig hilfreich. In diesem Beispiel tritt der Fahler zwar nichtmehr auf, aber vielleicht hilft es dir ja trotzdem...

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


class SwingDemo extends JFrame implements ActionListener{


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

    int a,b,c,d;
    JButton green;
    FigurePanel figurePanel = null;

  SwingDemo(){
      setSize(300,300);
      getContentPane().setLayout(new BorderLayout());
      green=new JButton("rechteck?");
      green.addActionListener(this);
      getContentPane().add(green, BorderLayout.NORTH);
      figurePanel = new FigurePanel();
      getContentPane().add(figurePanel, BorderLayout.CENTER);
	  setVisible(true);
  }


  public void actionPerformed(ActionEvent a){
      Figure x=new Quad(15,25,7,16);
      figurePanel.figure = x;
      figurePanel.repaint();
  }

}


class FigurePanel extends JPanel
{
	public Figure figure = null; // private machen!

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		if (figure != null)
		{
			figure.paintMe(g);
		}
	}
}



abstract class Figure
{
	public Figure(int x)
	{
		// max was mit x
	}

    abstract public void paintMe(Graphics g);
}

class Quad extends Figure{

    int x,y,w,h;





        Quad(int x,int y, int w, int h){
           super(x);
           this.y=y;
           this.w=w;
           this.h=h;
        }

        public void paintMe(Graphics g)
        {
            g.drawRect(x,y,w,h);
        }


}
```

Wenn noch was unklar ist, einfach mal konkret nachfragen.


----------



## Bernd1983 (6. Feb 2007)

@Marco13

thx das bsp hilft mir sehr.

ich hätte eine generelle Frage: Kann man eigentlich eine Grafik zeichnen in einer swing Komponente ohne Graphic Objekte?


----------



## FatFire (6. Feb 2007)

Nein. :wink:


----------

