# (MouseListener im Applet?) einzelne Komponenten neuzeichnen?



## Donut (2. Mai 2004)

Wie wende ich ein MouseListener in einem Applet an?
Wo muss ich ihn anmelden? in der init() oder Start() - Methode und was muss ich beachten?
Folgendes gibt bei klick eine NullPointerException:


```
public void init()
     {
		addMouseListener(new MouseListener()
							 {
								public void mouseClicked(MouseEvent e){g.setColor(new Color(0, 0, 0)); g.fillRect(20, 176, 83, 186);}   //bei klick zum Testen ein Rechteck zeichnen
								public void mouseEntered(MouseEvent e){return;}
								public void mouseExited (MouseEvent e){return;}
								public void mousePressed (MouseEvent e){return;}
								public void mouseReleased(MouseEvent e){return;}
							 }						
						 );
```

danke schon mal 

Bits&Bytes 
Donut


----------



## L-ectron-X (2. Mai 2004)

Melde den MouseListener in der init()-Methode an
Auch ist in Deinem Applet die Programmierung der MouseEvent-Methoden nicht richtig. Die werden nicht in der init()-Methode überschrieben sondern innerhalb vom Rumpf des Applets. Also so:

```
public class MeinApplet extends java.applet.Applet
   implements MouseListener {

   //Deklaration der Instanz-Variablen
   ...

   public void init() {
      //Intitialisierung aller Komponenten des Applets
      ...
      addMouseListener(this);
      ...
   }

   //Überschreiben der MouseClicked()-Methode
   public void mouseClicked(java.awt.event.MouseEvent me) {
      //was getan werden soll
   }
}
```
Die NullPointerException erhältst Du vermutlich, weil die java.awt.Graphics-Instanz nirgens deklariert wurde.


----------



## Illuvatar (2. Mai 2004)

Hm, hm...  


			
				l-ectron-x hat gesagt.:
			
		

> Melde den MouseListener in der init()-Methode an


Du kannst den MouseListener anmelden wo du willst.


			
				l-ectron-x hat gesagt.:
			
		

> Auch ist in Deinem Applet die Programmierung der MouseEvent-Methoden nicht richtig. Die werden nicht in der init()-Methode überschrieben sondern innerhalb vom Rumpf des Applets. Also so:


Wenn du das so machst, muss deine Klasse MouseListener implementieren. Ich ziehe aber Donuts Methode vor, nämlich eine anonyme Klassse, das, was Donut geschrieben hat, ist völlig korrekt.


			
				l-ectron-x hat gesagt.:
			
		

> Die NullPointerException erhältst Du vermutlich, weil die java.awt.Graphics-Instanz nirgens deklariert wurde.


Dann würed das Programm nicht kompilieren. Vermutlich steht irgendwo außerhalb der init Methode Graphics g, aber nirgends steht g = getGraphics();
Wenn du das so machst, wird das Rechteck übrigens beim nächsten repaint verschwinden.
Guck auch mal hier.


----------



## Donut (2. Mai 2004)

hmm

könnt ihr mir das System von paint() und repaint() erklären?
also wenn ich irgendwo repaint(); ausführe wird alles weggelöscht, es sein denn, man macht was?
wie erstelle ich eine Animation, bei dem nur ein objekt verändert wird?


----------



## L-ectron-X (2. Mai 2004)

@Illuvatar  Stimmt, hast Recht.


----------



## L-ectron-X (3. Mai 2004)

paint(Graphics g) ist eine Methode, die automatisch vom Browser aufgerufen wird. Z.B nach dem Start eines Applets, einem MouseEvent oder beim Scrollen des in eine Webseite eingebetteten Applets in den Anzeigebereich. repaint() ruft im Grunde nur die paint()-Methode eines Component-Objekts (von dem java.applet.Applet indirekt abgeleitet ist) auf, um ein Neuzeichnen zu erzwingen.


> wie erstelle ich eine Animation, bei dem nur ein objekt verändert wird?


Ich glaube die Frage hast Du schon selbst beantwortet. In dem Du nur dieses Objekt veränderst.


----------



## Donut (3. Mai 2004)

mmhh aha 

jetzt entsptet dabei aber folgendes problem:
wenn ich dieses Objekt durch ne schleife langsam verändere unc immer wieder repaint(); aufrufe, werden alle Komponenten aufgerischt und folglich flimmert alles....

kann man auch nur ein objekt neu zeichnen?


----------



## L-ectron-X (4. Mai 2004)

Versuche es mal mit der update()-Methode.


----------



## Guest (4. Mai 2004)

Füg diese Globalen Variablen...


```
private Image dbImage;
    private Graphics dbGraphics;
```

...und diese Methode in dein Applet ein:

```
public void update(Graphics g)
{
  //Double-Buffer initialisieren
    if (dbImage == null) {
     dbImage = createImage(
      this.getWidth(),
      this.getHeight()
     );
     dbGraphics = dbImage.getGraphics();
    }
   //Hintergrund löschen
   dbGraphics.setColor(getBackground());
   dbGraphics.fillRect(
     0,
     0,
     this.getWidth(),
     this.getHeight()
   );
   //Vordergrund zeichnen
   dbGraphics.setColor(getForeground());
   paint(dbGraphics);
   //Offscreen anzeigen
   g.drawImage(dbImage,0,0,this);
 }
```


Eventuell must du was ändern, bei mir war das jedenfalls nicht nötig.
Weiter Informationen unter: http://www.dpunkt.de/java/Programmieren_mit_Java/Grafikprogrammierung/10.html


----------



## nudelsalat (4. Mai 2004)

Jetzt hab ich doch glatt den Login vergessen -_-

Seis drum, das Javabuch hat unter dem Stichwort Offscreen auch noch was zu erzählen.
(Dort steht auch der eben erwähnte Code drin)
www.javabuch.de


----------



## Donut (4. Mai 2004)

@nudelsalat
das ist prinzipiell sehr praktisch ... 
nur arbeite ich nicht mit Grafiken sondern mit selbstgezeichneten formen, die auch noch halbtransparent sind.

vereinfacht also:
man nehme diese Konstellation als basis:






Jetzt soll das gelbe Rechteck grün werden(meinetwegen bei mausklick) , ohne das rote neu zu zeichnen.


----------

