# Hintergrundbild und grafischer Button (Transparenz Probleme)



## Matong (24. Aug 2004)

Hallo,

ich habe folgendes Problem:
Ich will auf ein JWindow ein Bildmalen, dass auch sehr gut klappt.

Jetzt möchte darauf einen grafischen Button (abgeleitet von JComponent) malen der eine gif(hintergrund transparent) anzeigt. Wenn ich mit der maus drüber fahre, soll der Hintergrund farbig dargestellt werden, wenn die Maus wieder weg ist, soll er wieder transparent werden.

Was schon geht:
Das ändern der Hintergrundfarbe funktioniert.

Problem:

Beim starten sehe ich nur das Hintergrundbild. Fahre ich mit der Maus über das Bild, wird der Button angezeigt(wenn ich ihn treffe), und zwar mit geänderter Hintergrundfarbe. Bewege ich die maus weg, wird der Hintergrund grau, aber nicht transparent.

Der Button wird auf einem JPanel angezeigt.

Button wie Panel sind setOpaque(false), also eigentlich Transparent.

Hier paint vom Button:

```
public void paint (Graphics g)  {
  if (color==true)
   g.drawImage(buttonImage,0,0,buttonBackground,this);
   else
   g.drawImage(buttonImage,0,0,this);

  }
```

Warum klappt das mit dem Transparent nicht, und warum wird der Button erst nicht gezeigt, und dann doch???


MfG Matong


----------



## Beni (24. Aug 2004)

Bei Swing sollte man immer die Methode "paintComponent" überschreiben. Das originale "paint" sorgt dafür, dass andere Components richtig gezeichnet werden. Ich hab mal was zusammengebastelt, das etwa dasselbe machen sollte wie deine Buttons, und mit paintComponent funktioniert es ganz gut.


```
public class Main{
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		
		PaintPanel panel = new PaintPanel( Color.RED );
		panel.setLayout( new GridLayout(2, 2) );
		panel.add( new PaintPanel( Color.GREEN ));
		panel.add( new PaintPanel( Color.BLUE ));
		panel.add( new PaintPanel( Color.YELLOW ));
		panel.add( new PaintPanel( Color.WHITE ));
		
		frame.getContentPane().add( panel );
		
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setBounds( 20, 20, 500, 500 );
		frame.setVisible( true );
	}
}

class PaintPanel extends JPanel implements MouseListener{
	private Color color;
	private boolean paint = false;
	
	public PaintPanel( Color color ){
		this.color = color;
		addMouseListener( this );
		setOpaque( false );
	}
	
	public void paintComponent( Graphics g ){
		if( paint ){
			g.setColor( color.darker() );
			g.fillRect( 0, 0, getWidth(), getHeight() );
		}
		
		g.setColor( color );
		g.fillOval( 0, 0, getWidth(), getHeight() );
	}

	public void mouseClicked(MouseEvent e) {
	}

	public void mouseEntered(MouseEvent e) {
		paint = true;
		repaint();
	}

	public void mouseExited(MouseEvent e) {
		paint = false;
		repaint();
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}
}
```


----------



## Matong (24. Aug 2004)

Servus,

also der trick ist nich schlecht, aber ich hab immer noch ein problem:

Wie man sieht wird dat Ding immer noch nicht durchsichtig, da wird so ein Rand gezeichnet.

Wie kriege ich den weg?

Schade, ich kann kein Bild anhängen


MfG Matong


----------



## matong (24. Aug 2004)

Ok,

es hat sich erledigt. Hatte mit den panels Probleme  gehabt, aber jetzt macht es dass was es soll.

Juhu.


Also, danke für deine Hilfe.

Cu Matong


----------

