# JComboBox und JTable transparent



## Gast2 (5. Jan 2008)

Hallo,

Ich hab jetzt hinbekommen dass meine Buttons,Textfelder,Prograssbar,TextAreas transparent sind...
Weiß jemand wie ich das für eine JCombox mache?????
Bei meiner Tabelle wird alles durchsichtig angezeigt außer der Header und die einzelnen Zeilen in denen was drin steht....Weiß hier jemand Hilfe....

thx


----------



## André Uhres (5. Jan 2008)

Bei JComboBox kann ma einen eigenen Renderer/Editor setzen und bei JTable kann man JTable#prepareRenderer überschreiben.


----------



## Gast2 (5. Jan 2008)

okay =) und was genau muss ich in dem prepareRenderer machen???
Muss ich meinen eigenen TableCellRenderer basteln??


----------



## André Uhres (5. Jan 2008)

SirWayne hat gesagt.:
			
		

> ..was genau muss ich in dem prepareRenderer machen?..


Einfach die Komponente vom Superaufruf durchsichtig machen und zurückgeben.


----------



## Gast2 (5. Jan 2008)

ok alles klar
EDIT klappt net


```
public Component prepareRenderer(TableCellRenderer renderer, int arg1, int arg2) {
	if(!transparent) return super.prepareRenderer(renderer, arg1, arg2);
	JComponent c= (JComponent) super.prepareRenderer(renderer, arg1, arg2);
	c.setOpaque(false);
	return c;
		
	}
```


----------



## André Uhres (6. Jan 2008)

SirWayne hat gesagt.:
			
		

> ..EDIT klappt net..


Und du hast auch Tabelle, Scrollpane und Viewport durchsichtig?


----------



## Gast2 (6. Jan 2008)

lol ok tabelle vergessen

den header hab ich so versucht


```
table.getTableHeader().setOpaque(false);
```


----------



## André Uhres (6. Jan 2008)

Beim Header musst du auch den Viewport (=scrollpane.getColumnHeader) durchsichtig machen 
und einen durchsichtigen Renderer setzen (Beispiel ist in den FAQ).


----------



## Gast2 (6. Jan 2008)

ok ich schau mal nach zu der tabelle noch???Also ich hab des gemacht


```
table.setOpaque(false);
                                jScrollPane.setOpaque(false);
		jScrollPane.getViewport().setOpaque(false);
```

jetzt ist alles durchsichtig außer der Header(was ich noch versuche), aber die scrollpane sieht man auch noch ....


----------



## André Uhres (6. Jan 2008)

SirWayne hat gesagt.:
			
		

> ..aber die scrollpane sieht man..


Wenn du schon die Scrollpane siehst, dann sind wir nicht mehr weit, denn das ist die unterste Schicht 
bevor unser Hintergrund kommt. Tabelle und Viewport sind also schon durchsichtig.
Weil die Scrollpane unter Tabelle und Viewport liegt, kannst du den Hintergrund noch nirgends darunter sehen. 
Aber mit scrollpane.setOpaque(false) müsste sie eigentlich durchsichtig werden: TransparentDemo.jar


----------



## Gast2 (6. Jan 2008)

Danke für das Beispiel hat alles wunderbar geklappt außer der header
bei 

```
scrollpane.getColumnHeader().setOpaque(false);
```

bekomm ich eine nullpointer Exception....


----------



## André Uhres (6. Jan 2008)

SirWayne hat gesagt.:
			
		

> ..bei
> 
> ```
> scrollpane.getColumnHeader().setOpaque(false);
> ...


Versuch mal  Window#pack() *vorher *aufzurufen.


----------



## Gast2 (6. Jan 2008)

ok hab erst ein pack() aufgerufen und dann mein panel,auf welchem die table ist, geaddet...immer noch nullpointer

```
pack();
        getContentPane().add(new TestPanel());
```

was hat das pack() damit zu tun??

EDIT: 
Was mich noch aufgefallen ist wenn ich das MotifLookAndFeel verwende sind die 2 Button an der Scrollbar durchsichtig doch sobald ich das ganz normale Swing l&f benutze sind die 2 buttons nimmer durchsichtig  =)...
kannst in deinem beispiel oben auch mal versuchen gleicher effekt...

mein versuch was er so hinzubekommen

```
c = jScrollPane.getVerticalScrollBar().getComponents();
        
        for (int i = 0; i < c.length; i++) {
            JButton component = (JButton) c[i];
            component.setOpaque(false);
            component.setContentAreaFilled(false);
        }
```


----------



## André Uhres (6. Jan 2008)

So sollte es funktionieren:

```
...
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                scrollpane.getColumnHeader().setOpaque(false);
            }
        });
        
...
...
    public static void main(String[] args) {
...
...
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new TransparentDemo().setVisible(true);
            }
        });
        
    }
...
```


----------



## Gast2 (6. Jan 2008)

cool funktioniert...kannst du mir auch erklären warum es so keine nullpointer mehr gibt???

Und des mit denen MetallScrollButton klappt auch net so ganz....

Was ich auch noch fragen wollt wenn ich schon dabei bin !!!!Wenn ich jetzt ein weiters JDialog oder ein JFrame drüber leg.Gibt es es bei denen auch die Möglichkeit durchsichtig zu werden, dass sie quasi den hintergrund(ist ja dann nur ein teil) vom vaterdialog haben???

mfg


----------



## André Uhres (7. Jan 2008)

Es gibt keine NPE mehr weil die GUI sichtbar ist. JDialog/JFrame kann Java nicht durchsichtig machen.


----------



## Gast2 (7. Jan 2008)

ok alles klar!!! aber die GUI ist/war doch sichtbar es funktioniert ja erst seitdem ich 

```
SwingUtilities.invokeLater(new Runnable() { 

    public void run() { 
        if(jScrollPane.getColumnHeader()!=null) jScrollPane.getColumnHeader().setOpaque(false);
        System.out.println("Header durchsichtig");
        } 
		         });
```
drin hab...Ich versteh nur nicht warum ich die restlichen setOpaque(false) nicht in das run reinmachen muss....


----------



## André Uhres (8. Jan 2008)

Den Header Viewport kann man wohl erst holen, wenn die Gui sichtbar ist. Bei den restlichen setOpaque(false) ist die Gui zu dem Zeitpunkt noch unsichtbar.


----------



## Gast2 (8. Jan 2008)

aso ok alles klar...thx


----------

