# Dargestellten Bild auf (AWT) Button wieder löschen



## dj-md (15. Oktober 2007)

Hallo Leute,

ich habe folgendes Problem.
Ich zeichne auf eine Button (AWT Button) ein Bild über die Methode paint(Graphics g).
Das Image wird im Konstruktor initialisiert. 

image = Toolkit.getDefaultToolkit().getImage(new File(imageFileName).getAbsolutePath

public void paint(Graphics g) {
		if (image != null)
			g.clearRect(0, 0, getWidth(), getHeight());
			g.drawImage(image, 0, 0, this);
	}

Das ist ja relativ simpel. Aber ich möchte das Bild, auf dem Button über einen Knopf
ein und ausblenden. Wie bekomme ich denn das Bild wieder von dem Button weg?
Ein g.clearRect(0, 0, getWidth(), getHeight()); löscht das Bild zwar, von dem Button 
aber dafür geht die Komponentendarstellung der Button kaputt. 
Ich kann doch nun nicht den gesamten Button (Schattierung, 3D/Button Effekt) neu zeichnen.

Hat jemand eine Idee, wie ich das realisieren könnte?

Danke & Viele Grüße
MD


----------



## zeja (15. Oktober 2007)

Du brauchst dir doch nur in einem Flag merken ob das Bild im paint gezeichnet werden soll oder nicht. Wenn das Bild nicht gezeichnet werden soll lässt du das g.drawImage halt weg und rufst entsprechend ein repaint auf.


----------



## dj-md (16. Oktober 2007)

Danke für die Antwort. 

Ds wäre zu einfach gewesen  Denn so wollte ich es auch lösen. 
Aber genau das funktioniert leider nicht.
Wenn die paint methode verarbeitet wurd und ich den Frame "minimiere" und wieder "maximiere", dann
wird das Bild richtigerweiße nicht mehr angezeigt. Aber wenn der Frame im Sichtbereich bleibt, dann wird das Bild weiterhin gezeichnet. 


void actionPerformed()
{
draw=false;
repaint()
}


public void paint(Graphics g) {
		if (draw) {

				if (image != null) {
					g.drawImage(image, 0, 0, this);
				}

			}

		super.paint(g);

	}

Noch eine Idee?

Gruß
dj-md


----------



## zeja (16. Oktober 2007)

Hi,

also habe mal nen Beispiel gemacht in welchem das ganze so funktioniert:

```
import java.awt.Button;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ButtonImageTEst extends Frame {

	private Image m;
	private boolean draw;

	public ButtonImageTEst() {
		super("ButtonImageTest");

		m = Toolkit.getDefaultToolkit( ).createImage("test.JPG");
		draw = true;

		final Button b = new Button("test") {

			@Override
			public void paint(Graphics g) {
				super.paint(g);
				if (draw && m != null) {
					g.drawImage(m, 0, 0, this);
				}
			}

		};

		b.addActionListener(new ActionListener( ) {

			@Override
			public void actionPerformed(ActionEvent evt) {
				draw = !draw;
				b.repaint( );

			}

		});

		add(b);

		pack( );
		setVisible(true);

	}

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

}
```

Immer wenn man auf den Button drückt wird das Bild gezeichnet oder wieder nicht gezeichnet.

Bitte nutze in Zukunft auch die entsprechend code bzw java Tags um deinen Code formatiert dazustellen.


----------



## dj-md (16. Oktober 2007)

Okay, das Problem ist doch etwas komplizierter wie ich dachte. 
Also, ich habe mehrerer Buttons worauf ich Bilder darstelle., 
Diese Button sind auf einem Panel in einem Frame. 

Über einen separaten Button, soll aktiviert werden ob die Bilder dargestellt werden 
oder nicht. Das draw Flag wird auch ordnungsgemäß auf "false" gesetzt und über 
ein System.out in der paint(Grahpics g) Mehtode des Button zeigt es auch richtig 
an, dass er durch das Image nicht neu zeichnen würde/soll. 
Aber Angezeigt wird es trotzdem noch 

So löse ich es Momentan

//action performed des on/off buttons


```
//action performed des on/off buttons
public void actionPerformed() {
   for (int i = 0; i < panel.getComponentCount(); i++) {
       if (frame.getComponent(i) instanceof MeinButton) {
           MeinButton myBtn = (MeinButton) getComponent(i);
           myBtn.setDraw(false)
           myBtn.repaint();
       }
   }
}
```
 
Dieser Lösungsansatz, funktioniert aber leider nicht.

Wenn man aber das myBtn.setDraw(false) in der actionPerformed Methode des
Button setzt, auf dem gerade gecklicked wird (wie in deinem Beispiel) 
und welcher auch gerade ein Bild darstellt, dann funktioniert es und der 
Button wird danach ohne Bild dargestellt. Es kommt mir fast so vor, dass nach 
dem actionPerformed, noch irgend ein anderes refresh/redraw auslöst wird!?.

Aber ich wie schon erwähnt, ich möchte nicht auf den Button klicken der das Bild
Darstellt, sondern über einen anderen Button die Darstellung der Bilder beenden.

Das setVisible(true) in deinem Beispiel machte mich stutzig und ich probierte 
damit etwas. Wenn ich panel.setVisible(true) setzte bzw. auf jedem myBtn.setVisible(true),
dann änderte sich gar nichts. Aber wenn ich frame.setVisible(true) setzte, dann sind die
Bilder weg. Es wird also tatsächlich alles neu gezeichnet. Aber das flackert ziemlich
und ist sehr unschön. ---> alles sehr komisch  



Gruß & Danke
md


----------



## Tobias Köhler (16. Oktober 2007)

Ich glaub, dazu solltest du dir mal DoubleBuffer oder so angucken. Weiß nicht mehr genau wie es hieß und eigentlich kenn ich das auch nur von Delphi, aber in Java gibt es das meines Wissens auch.
PS:





> komplizierter wie ich dachte.


 Es heißt ALS


----------

