JTextField und JTextArea halbtransparent

VinoRosso

Grünschnabel
Hallo, ich suche jetzt schon seit Stunden eine Möglichkeit Textfelder oder Areas halbtransparent zu machen.

meine bisherige Idee den Dingern einfach mit
setBackground(new Color(1.0f, 1.0f, 1.0f, 0.5f));
eine halbtransparente Hintergrundfarbe zu geben scheint wohl nicht zu funktionieren. sobald man was reischreibt wird nur bullshit angezeigt.

gibts dafür ne einfache Möglichkeit und ich seh sie einfach nicht, oder wird das Komplizierter? bin noch ziemlicher Java Anfänger.
 
Auszug aus einem anderen Forum:

Die Klasse javax.swing.JRootPane sagt u.a.:
"... The painting architecture of Swing requires an opaque JComponent to exist in the containment hieararchy above all other components.This is typically provided by way of the content pane. If you replace the content pane, it is recommended that you make the content pane opaque by way of setOpaque(true). Additionally, if the content pane overrides paintComponent, it will need to completely fill in the background in an opaque color in paintComponent. ..."

Ein durchsichtiges swing-Fenster ist demnach nicht möglich/zuempfehlen. Ansonsten kann aber die Transparenz von Swing-Komponenten über die Methode setOpaque gesteuert werden, nur die "oberste" Komponente darf/sollte nicht durchsichtig sein. Ich weiß nicht, was passiert, wenn Du es doch machst - dürfte intressant werden ...
 
Hallo,

mit der Methode setOpaque machst du die ganze Component transparent, also ganz durchsichtig.
Mir würde jetzt leider nichts einfallen, wie man eine Component einfach halb durchsichtig machen kann.


MFG

zEriX
 
Also es muss doch ne Möglichkeit geben....

Mit der Transparenten Hintergrundfarbe setzen klappt das zwar, aber nur solange bis ich was reinschreibe. Danach wird es buggy und es zeigt mit andere Kompenenten innerhalb der TextArea an, immerhin transparent, aber.... naja so wars nicht gedacht :).

und was geschriebenes aus der TextArea löschen funktioniert auch nicht, es bleibt dann ganz leicht transparent stehen....

also ich bin am verzweiflen, deshalb mach ich jetzt Feierabend. morgen ist auch noch ein Tag ;)
 
ich habs jetzt mal anders probiert, aber das Ergebnis ist imer noch dasselbe :(

ich komm nicht dahinter, ich muss wohl noch weitere Methoden überschreiben, ich weiß bloss nicht welche....

Code:
class TransparentTextField extends JTextField{

	public void paintComponent(Graphics g){
		Graphics2D g2d = (Graphics2D)g;
		Composite oldcomp = g2d.getComposite();
		Composite alphaComp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
		g2d.setComposite(alphaComp);
		super.paintComponent(g2d);
		g2d.setComposite(oldcomp);
	}
}

sobald text eingegeben wird ist die Transparenz weg und der Text wird komisch dargestellt...

ich wäre wirklich sehr dankbar für eine kleine Hilfestellung.
 
also ich hab immer noch keine Lösung gefunden.....

ich dacht ich tricks einfach und leg ein Textfeld mit opaque(false) auf ein Panel mit halbtransparenter Hintergrundfarbe...

nix wars! verhält sich ganz genauso.
 
Hallo,

ein kleiner Trick scheint zu funktionieren:
Mit setOpaque(false) auf Komponente auf transparent stellen UND nun
paintComponent überschreiben:

protected void paintComponent(Graphics g) {
g.setColor(getBackground());
Rectangle tBounds = g.getClip().getBounds();
g.fillRect((int) tBounds.getX(),(int)tBounds.getY(),(int)tBounds.getWidth(),(int)tBounds.getHeight());
super.paintComponent(g);
}

Als Erklärung vermute ich, dass setOpaque benötigt wird, damit paintComponent
auf einem sauber defineirten Hintergrund ausgeführt wird. Bei setOpaque(true) muss der Hintergrund nicht sauber definiert werden und ist es dann aus Perfomancegründen auch nicht.

Gruß
Franz Mauch
 
Vielen, vielen Dank!

Ich dachte mir schon das es irgendwie mit Rectangle und fill klappen könnte, nur wusste ich nicht wie ich das anwenden kann, da fehlt mir noch ein bisschen der Durchblick.

Ohne Deine Hilfe wäre ich wohl noch ewig an dem Problem gesessen.

so hab ichs jetzt gelöst:
Code:
class TransparentTextField extends JTextField{
	
	public TransparentTextField (){
		this.setOpaque(false);
	}


	protected void paintComponent(Graphics g){
		Graphics2D g2d = (Graphics2D)g;
		this.setBackground(Color.white);
		Composite alphaComp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.65f);
		g2d.setComposite(alphaComp);
		g2d.setColor(getBackground());
		Rectangle tBounds = g2d.getClip().getBounds();
		g2d.fillRect((int) tBounds.getX(),(int)tBounds.getY(),(int)tBounds.getWidth(),(int)tBounds.getHeight());
		super.paintComponent(g2d);
		this.setForeground(Color.black);
	}	
	
}

nochmal vielen Dank.

mfg Vino
 
Zurück