Dargestellten Bild auf (AWT) Button wieder löschen

dj-md

Grünschnabel
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
 
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.
 
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
 
Hi,

also habe mal nen Beispiel gemacht in welchem das ganze so funktioniert:
Java:
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.
 
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

Code:
//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
 
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 ;)
 
Zurück