# JPanel Hintergrund transparent setzen?



## Hackepeter (18. Sep 2012)

Servus,

suche nun schon eine ganze Weile nach einer vernünftigen Lösung, wie man den Hintergrund eines JPanels transparent rendern kann. Am besten wärs, wenn einfach nur die paintComponent-Methode überschrieben wird. 

Ich finde leider immer nur die Aussage, dass man ein LayeredPane verwenden soll, weils mit dem leichter geht. Ich habe auch gesehen, dass man ein GlassPane verwenden kann, allerdings komme ich damit überhaupt nicht klar. 

Ich arbeite mit dieser Vorlage: 


```
private JPanel panel = new JPanel(){
	    protected void paintComponent(Graphics g)
	    {
	        g.setColor( getBackground() );
	        g.fillRect(0, 0, getWidth(), getHeight());
	        super.paintComponent(g);
	    }
	};
```

Ich habe versucht, bei setColor null zu übergeben, aber das macht ja eigentlich auch keinen Sinn. Methoden um das Ganze transparent zu machen, habe ich keine gefunden.

Hat jemand eine Idee?


----------



## Marcinek (18. Sep 2012)

JComponent (Java Platform SE 7 ))


void	setOpaque(boolean*isOpaque)
If true the component paints every pixel within its bounds.


----------



## jgh (18. Sep 2012)

die Methode setOpaque(boolean b) langt dir nicht?

für den JFrame dann [c]		AWTUtilities.setWindowOpacity(frame, 0.5f);
[/c]...


----------



## Hackepeter (18. Sep 2012)

setOpaque habe ich schon auf false gesetzt, allerdings wird der Hintergrund dennoch angezeigt. 
Und was bewirkt das hier? 

```
AWTUtilities.setWindowOpacity(frame, 0.5f);
```
Der Frame soll ja normal angezeigt werden.


----------



## jgh (18. Sep 2012)

das bewirkt, dass der Frame durchsichtig wird...

und die setOpaque-Methode macht genau das, was man von ihr erwartet!
mit den "Auskommentierungen" mal ein wenig rumspielen...und du wirst erkennen, dass es eigentlich genau so funktioniert.


```
public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(500, 500);
		f.setLocationRelativeTo(null);
//		AWTUtilities.setWindowOpacity(f, 0.5f);
		JPanel p = new JPanel();
		p.setBackground(Color.RED);
//		p.setOpaque(false);
		f.add(p);
		f.setVisible(true);
	}
```


----------



## Hackepeter (18. Sep 2012)

Ich habe es genau so gemacht und ich kann durch das JPanel leider nicht die Hintergrundgrafik sehen:







So in etwa sieht das Ganze aus:


```
public class Mainwindow extends JFrame {
	private JBGPanel contentPane; // erbt von JPanel; Hintergrundgrafik
	private JPanel panel = new JPanel();
	private JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);

	public Mainwindow() {
		tabbedPane.setOpaque(false);
		panel.setOpaque(false);
		tabbedPane.addTab("Gebäuderechner", null, panel, null);
		panel.setLayout(null);
		contentPane.add(tabbedPane);
	}	
}
```
Das ist im Groben der Aufbau, wie ich ihn habe. Beim tabbedPane zeigt das setOpaque(false) wirkung, denn oben bei den Reitern sieht man am Rand nun den Hintergrund.


----------



## Hackepeter (18. Sep 2012)

Niemand? 

*Edit:* Hier noch mal zum Veranschaulichen:






Habe nun sogar Zweifel gehabt, dass es doch am tabbedPane liegt und folgendes eingefügt:


```
UIManager.put("TabbedPane.contentOpaque", false);
```

Das hat allerdings auch nichts verändert.


----------



## Hackepeter (18. Sep 2012)

Hier noch ein Screenshot, damit ihr euch ein Bild machen könnt:

PS: Hat man nur begrenzt Zeit, seinen Beitrag zu editieren?


----------



## Michael... (18. Sep 2012)

Würde sagen falsche Frage.
Richtig: (Wie) kann man bei einer JTabbedPane den Hintergrund transparent setzen?

Da haben sich - wenn ich das richtig im Kopf habe - schon ein paar Leute den Kopf zerbrochen. Die JTabbePane ist eine relativ komplexe Komponente, da müsste man vermutlich ziemlich tief eingereifen um das ganze transparent zu bekommen.


----------



## Gast2 (18. Sep 2012)

Tja wenn man nach JTabbed Pane transparent sucht findet man erstaunlicherweise: http://www.java-forum.org/awt-swing-swt/82924-jtabbedpane-transparent.html


----------



## Spacerat (18. Sep 2012)

@Hackepeter: Schon klar, warum du mit 'ner GlassPane nicht klar kommst, sonst würdest du ja hier nicht fragen, wie man einen Panel durchsichtig bekommt.
Die "Magie", die dahintersteckt ist, dass die "GlassPane" im Prinzip genau jener Panel einer Klasse ist, den du grad' selbst erstellen möchtest. Deswegen wird einem ja auch zum LayeredPane geraten, weil die bereits das von dir gewünschte bietet. Die Frage müsste also lauten, wie man eine solche "GlassPane" selbst erstellt und für AWT wäre diese Frage auch vollkommen berechtigt, in Swing aber langt es, wenn man sich dazu schlicht den Quellcode der LayeredPane zur Inspiration ansieht.

```
public void paintComponent(Graphics g) {
  for(Component c : layers) {
    c.paint(g);
  }
}
```
sollte das im allgemeinen ein wenig verdeutlichen (ob es so korrekt ist oder nicht ueh. "layers" ist dabei eine beliebige Collection<Component> durch welche das Graphics-Object gereicht wird. Das was mehr durchscheinen soll, sollte dabei am Anfang dieser Collection stehen.


----------

