# Objekte "durch" ActionListener zeichnen



## Vril (28. Dez 2004)

Hallo habe folgendes kleines Programm geschrieben.
Jetzt hätte ich gerne das nach den entsprechenden Buttons folgendes geschieht:
löschen = Zeichenfeld soll gelöscht werden
Oval zeichnen = ein Oval soll gezeichnet werden usw. 

Ich habe aber leider keine wirklich Idee wie ich das machen soll. Hab es mit g.drawRect (10, 20, 10, 30);
versucht, aber da sagt der compiler: cannot find symbol variable g

Was habe ich da falsch gemacht:

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

class MyCanvas extends Canvas {
	String text = "";
	
	public void paint (Graphics g) {
		g.drawString ( text, 10, 10);
	}
	
	public void setText (String text) {
		this.text = text;
		repaint();
	}
}

public class Grafik_Programm extends Frame implements ActionListener {
		
	private Panel panelCenter;
	private Button loeschen, ozeichnen, lzeichnen, rzeichnen;
	public Grafik_Programm (String Title) {
		super (Title);
		Panel panelNorth = new Panel();
		panelNorth.add (loeschen = new Button ("clear"));
		panelNorth.add (ozeichnen = new Button ("Oval zeichnen"));
		panelNorth.add (lzeichnen = new Button ("Linie zeichnen"));
		panelNorth.add (rzeichnen = new Button ("Rechteck zeichen"));
		panelCenter = new Panel();
		add ("North", panelNorth);
		
		panelCenter.setLayout (new CardLayout());
		add ("Center", panelCenter);
		setSize (600,400);
		//for (int i = 1; i <= 7; i++)
		//panelCenter.add ("Schalter " + i, new Button ("Schalter " + i));
		setVisible(true);

    loeschen.addActionListener (this);
    ozeichnen.addActionListener (this);
    lzeichnen.addActionListener (this);
    rzeichnen.addActionListener (this);
		
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent event) {
				System.exit(0);
			}
		});
	
	}
	
	public void actionPerformed(ActionEvent event) {
		CardLayout cl = (CardLayout)panelCenter.getLayout();
	
		if (loeschen == event.getSource())
		//Zeichenfeld soll gelöscht werden
  
   	else if (ozeichnen == event.getSource())
	  //ein Oval soll gezeichnet werden
	
		else if (lzeichnen == event.getSource())
		//eine Linie soll gezeichnet werden
	
		else if (rzeichnen == event.getSource())
		g.drawRect (10, 10, 20, 25)
		//ein Rechteck soll gezeichnet werden
	}
	
	
	public static void main (String [] args) {
		new Grafik_Programm ("BorderLayout");
	}
}
```


----------



## Beni (29. Dez 2004)

Du kannst entweder ein Image benutzen, und auf dieses Image zeichnen, das würde dann etwa so aussehen:

```
public class GrafikProgramm extends ...{
  private BufferedImage image = new BufferedImage( 600, 600, BufferedImage.TYPE_INT_RGB );

  public void actionPerformed( ActionEvent e ){
     if( ... ){
        Graphics g = image.getGraphics(); 
        g.setColor( Color.RED );
        g.fillRect( 10, 10, 30, 30 );
        repaint();
     }
  }

  public void paint( Graphics g ){
    g.drawImage( 0, 0, image, this );
  }
}
```

Oder du speicherst die Rechtecke, Ovale und was auch alles als Objekte in einer Liste, und zeichnest diese Liste jeweils. Das würde dann in diese Richtung gehen.


----------



## Vril (29. Dez 2004)

@Beni
Schon mal danke! Schaut nicht schlecht aus!
Jetzt habe ich aber das Problem, wenn ich das mit "private BufferedImage..." usw. mit einbinde, der Compiler meckert und meint: cannot find symbol class BufferedImage

Muß ich bzgl. BufferedImage noch eine eigene Klasse schreiben bzw. was anderes implementieren?


----------



## Beni (29. Dez 2004)

Du musst noch einen import machen, "import java.awt.image.BufferedImage" am Anfang der Datei hinschreiben.


----------



## Guest (29. Dez 2004)

Füge noch "g.dispose();" irgendwo dazu ein.


----------



## Vril (29. Dez 2004)

@Beni
Danke! Dachte wenn ich import java.awt.* schreibe, import er den Rest automatisch...
So, also ich bin dank deiner Hilfe wieder ein Stück weiter gekommen. Jetzt hängt der Compiler aber bei g.drawImage!

cannot find symbol
symbol  : method drawImage(int,int,java.awt.image.BufferedImage,Grafik_Programm)
location: class java.awt.Graphics
    g.drawImage( 0, 0, image, this ); 
     ^

Also hier noch mal mein Code, damit man sieht wie ich es eingebaut habe:

```
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

class MyCanvas extends Canvas {
		public void paint (Graphics g) {
				
		g.drawRect (50, 50, 10, 10);
		g.drawLine (0, 10, 251, 121);
		g.drawLine (100, 0,100, 100);
		g.drawOval (29, 32, 32, 23);
	
	
	}
}

public class Grafik_Programm extends Frame implements ActionListener {
	private BufferedImage 
	image = new BufferedImage( 600, 600, BufferedImage.TYPE_INT_RGB ); 	
	private Panel panelCenter;
	private Button loeschen, ozeichnen, lzeichnen, rzeichnen;
	public Grafik_Programm (String Title) {
		super (Title);
		Panel panelNorth = new Panel();
		panelNorth.add (loeschen = new Button ("clear"));
		panelNorth.add (ozeichnen = new Button ("Oval zeichnen"));
		panelNorth.add (lzeichnen = new Button ("Linie zeichnen"));
		panelNorth.add (rzeichnen = new Button ("Rechteck zeichen"));
		panelCenter = new Panel();
		add ("North", panelNorth);
		
		panelCenter.setLayout (new CardLayout());
		add ("Center", panelCenter);
		setSize (600,400);
		//for (int i = 1; i <= 7; i++)
		//panelCenter.add ("Schalter " + i, new Button ("Schalter " + i));
		setVisible(true);

    loeschen.addActionListener (this);
    ozeichnen.addActionListener (this);
    lzeichnen.addActionListener (this);
    rzeichnen.addActionListener (this);
		
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent event) {
				System.exit(0);
			}
		});
	
	}
	
	public void actionPerformed(ActionEvent event) {
		CardLayout cl = (CardLayout)panelCenter.getLayout();
	
		if (loeschen == event.getSource()){
		 		
		//add (new MyCanvas(), BorderLayout.CENTER);
		Graphics g = image.getGraphics(); 
        g.setColor( Color.RED ); 
        g.drawRect( 10, 10, 30, 30 ); 
        repaint();
        	g.dispose();
         
}
  
   	else if (ozeichnen == event.getSource())
	  System.out.println("Oval zeichen");
	
		else if (lzeichnen == event.getSource())
		System.out.println("Linie zeichnen");
	
		else if (rzeichnen == event.getSource())
		System.out.println("Rechteck zeichnen");
	}

	public void paint( Graphics g ){ 
    g.drawImage( 0, 0, image, this ); 
    }
	
	public static void main (String [] args) {
		new Grafik_Programm ("BorderLayout");
	}
}
```


----------



## Beni (29. Dez 2004)

Ops, hab die Reihenfolge der Argumente vertauscht.

g.drawImage( image, 0, 0, this );

Sowas kannst du übrigens ganz gut in der API nachgucken :wink:


----------



## Vril (29. Dez 2004)

@Beni
Nochmals danke, jetzt meckert der Compiler nicht mehr!
Aber leider zeichnen tut er immer noch nichts........ :cry: 
Warum nur?

Ja das mit der api und dem JCreator LE funktioniert irgendwie nicht. Das Problem haben mehrere und keiner weiss warum....


----------



## Illuvatar (29. Dez 2004)

Vril hat gesagt.:
			
		

> Ja das mit der api und dem JCreator LE funktioniert irgendwie nicht. Das Problem haben mehrere und keiner weiss warum....


Bei mir im JC Pro tut die API auch nur so halb, mit STRG+F1 sucht der nach irgendnem Quatsch... aber dann schau halt in deinem Browser


----------



## Beni (30. Dez 2004)

Hab da mal was rumgebastelt, und die Ovale als Test implementiert. Das ist eine mögliche Art, das ganze zu lösen:


```
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;

class MyCanvas extends Canvas {
	private BufferedImage image;
	
	public MyCanvas( int width, int height ){
		image = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB );
		setPreferredSize( new Dimension( width, height ) );
	}
	
	public void drawOval( int x, int y, int width, int height ){
		Graphics g = image.getGraphics();
		g.setColor( Color.RED );
		g.fillOval( x, y, width, height );
		g.dispose();
		repaint();
	}
	
	public void paint (Graphics g) {
		g.drawImage( image, 0, 0, this );
	}
}

class Grafik_Programm extends Frame implements ActionListener {
       
   
   private MyCanvas canvas = new MyCanvas( 600, 600 );
   private Button loeschen, ozeichnen, lzeichnen, rzeichnen;
   
   public Grafik_Programm (String Title) {
      super (Title);
      Panel panelNorth = new Panel();
      panelNorth.add (loeschen = new Button ("clear"));
      panelNorth.add (ozeichnen = new Button ("Oval zeichnen"));
      panelNorth.add (lzeichnen = new Button ("Linie zeichnen"));
      panelNorth.add (rzeichnen = new Button ("Rechteck zeichen"));
      add ("North", panelNorth);
      
      
      add ("Center", canvas );
      pack();
      //for (int i = 1; i <= 7; i++)
      //panelCenter.add ("Schalter " + i, new Button ("Schalter " + i));
      setVisible(true);

    loeschen.addActionListener (this);
    ozeichnen.addActionListener (this);
    lzeichnen.addActionListener (this);
    rzeichnen.addActionListener (this);
      
      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent event) {
            System.exit(0);
         }
      });
   
   }
   
   public void actionPerformed(ActionEvent event) {
   
      if (loeschen == event.getSource()){
      	
      }
 
      else if (ozeichnen == event.getSource()){
      		canvas.drawOval( (int)(500 * Math.random()), 
      				(int)(500 * Math.random()), 
      				(int)(100 * Math.random()), 
      				(int)(100 * Math.random()) );
      }
   
      else if (lzeichnen == event.getSource())
      System.out.println("Linie zeichnen");
   
      else if (rzeichnen == event.getSource())
      System.out.println("Rechteck zeichnen");
   }
   
   public static void main (String [] args) {
      new Grafik_Programm ("BorderLayout");
   }
}
```


----------



## Vril (30. Dez 2004)

@Beni
 :applaus:  Nicht schlecht! Jetzt klappt natürlich alles... Danke nochmal!


----------

