JPanel Hintergrund transparent setzen?

Hackepeter

Aktives Mitglied
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:

Java:
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?
 
setOpaque habe ich schon auf false gesetzt, allerdings wird der Hintergrund dennoch angezeigt.
Und was bewirkt das hier?
Java:
AWTUtilities.setWindowOpacity(frame, 0.5f);
Der Frame soll ja normal angezeigt werden.
 
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.

Java:
	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);
	}
 
Ich habe es genau so gemacht und ich kann durch das JPanel leider nicht die Hintergrundgrafik sehen:

Unbenannt8591.PNG


So in etwa sieht das Ganze aus:

Java:
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.
 
Niemand? 🙁

Edit: Hier noch mal zum Veranschaulichen:

Unbenanntad54.PNG


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

Java:
UIManager.put("TabbedPane.contentOpaque", false);

Das hat allerdings auch nichts verändert.
 
Zuletzt bearbeitet:
Hier noch ein Screenshot, damit ihr euch ein Bild machen könnt:

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

Anhänge

  • Unbenannt9223.PNG
    Unbenannt9223.PNG
    46,8 KB · Aufrufe: 48
Zuletzt bearbeitet:
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.
 
@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.
Java:
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.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben