# Transparenz mit AWTUtilities aber nur das Fenster nicht die Buttons



## outbreaker (27. Sep 2009)

Hallo,

ich habe schon viel gelesen im Forum aber dazu noch nicht wirklich eine Antwort gefunden.
Ich habe mir den Artikel zu AWTUtilities  durchgelesen und auch getestet aber ich finde keine Möglichkeit den Frame zu z. B. 50% durchsichtig zu machen aber den Button ganz normal zu zeichnen ohne das er durchsichtig wird. :bahnhof:
In Figure 5 ist es ja so zu sehen.
Nun habe ich beim Beispiel auf 50% gestellt und auch "per-pixel translucent effect" aktiviert nur das der Button dann bei mir auch Transparent wird ???:L

Geht das überhaupt das der Button nicht Transparent ist?
Wenn Ja kann mir einer sagen wie das im Code aussehen müsste?

besten Dank schon mal


----------



## KrokoDiehl (28. Sep 2009)

Hallo.
Ich habe ehrlich gesagt noch nichts mit Transparenz gemacht (ok, außer bei _BufferedImage_...), aber finde es spontan interessant!
Was du vorhast, ist aber genau das, was in deinem genannten Link bei _Figure 5_ und _6_ ist, stimmt's?
Hast du schonmal probiert bei dem Button 
	
	
	
	





```
setOpaque(true)
```
zu setzen? Oder ggfs. seine Hintergrundfarbe mit entsprechenden, deckenden Alphawert?


----------



## outbreaker (28. Sep 2009)

setOpaque(true) hatte ich auch probiert aber es macht den Anschein als ob alles im Fenster transparent gemacht wird ;(


----------



## Nader (29. Sep 2009)

outbreaker hat gesagt.:


> ..
> Geht das überhaupt das der Button nicht Transparent ist?
> ..




ich glaube schon. du müsstest allerdingst die paint() Methode der Komponenten anpassen, bzw. die Komponenten selber zeichnen!


```
Graphics2D g2d = (Graphics2D) g;
  g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.75f));
```


----------



## outbreaker (29. Sep 2009)

Wenn ich die Paint()-Methode von meinem JFrame so überschreibe zeichnet er leider trotzdem alles durchsichtig

hier mal mein Code
MainKlasse:
[Java]
public class Main_InfoFrame
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		final InfoFrame fd = new InfoFrame();
		fd.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent evt) {
                Shape shape = null;
                shape = new RoundRectangle2D.Float(0, 0, fd.getWidth(), fd.getHeight(), 30, 30);
                AWTUtilitiesWrapper.setWindowShape(fd, shape);
            }
            });
		AWTUtilitiesWrapper.setWindowOpaque(fd, false);

		//AWTUtilitiesWrapper.setWindowOpacity(fd, 0.6f);
		fd.setVisible(true);
	}
}
[/code]

JFrame-Klasse:

```
public class InfoFrame extends JFrame
{

	private JPanel hintergrundPanel;
	private JPanel textPanel;
	
	public InfoFrame()
	{
		initHintergrundPanel();
		initTextPanel();
	}
	
	private void initHintergrundPanel()
	{
		hintergrundPanel = new JPanel(null)
		{
			@Override
			protected void paintComponent(Graphics g)
			{
				if (g instanceof Graphics2D) 
				{

					Graphics2D g2d = (Graphics2D) g;
					g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
					System.out.println("drin3");
					super.paintComponent(g2d);
				}
				else
					super.paintComponent(g);
			}
		};
		setUndecorated(true);
		setLocationRelativeTo(null);
		hintergrundPanel.setBackground(new Color(243,235,216));
		this.add(hintergrundPanel);
		this.setSize(500, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
	}
	
	private void initTextPanel()
	{
		textPanel = new JPanel(new BorderLayout()){
			@Override
			protected void paintComponent(Graphics g)
			{
				if (g instanceof Graphics2D) 
				{

					Graphics2D g2d = (Graphics2D) g;
					g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
					System.out.println("drin p2");
					super.paintComponent(g2d);
				}
				else
					super.paintComponent(g);
			}
		};
		setUndecorated(true);
		setLocationRelativeTo(null);
		textPanel.setBackground(new Color(255,255,0));
		textPanel.setBounds(10, 20, 480, 100);
		hintergrundPanel.add(textPanel);
		setText("Überschrift", "das ist der Texgt");
	}
	
	private void setText(String head, String text)
	{
		JLabel headJL = new JLabel(" " + head);
		Font f = new Font("Verdana", Font.BOLD, 18);
		headJL.setFont(f);
		
		JLabel textJL = new JLabel(text);
		textJL.setFont(textJL.getFont().deriveFont(12));
		
		textPanel.add(new JLabel(" "),BorderLayout.WEST);
		textPanel.add(headJL,BorderLayout.NORTH);
		textPanel.add(textJL,BorderLayout.CENTER);
		
		/**Button hinzufügen**/
		JButton b = new JButton("test test")
		{
			@Override
			public void paintComponent(Graphics g)
			{
				if (g instanceof Graphics2D) 
				{
					Graphics2D g2d = (Graphics2D) g;
					g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
					super.paintComponent(g2d);
				}
				else
				{
					super.paintComponent(g);
				}
			}
		};
		b.setOpaque(true);
		textPanel.add(b,BorderLayout.SOUTH);
	}
	
	@Override
	public void paint(Graphics g)
	{
		if (g instanceof Graphics2D) 
		{
			Graphics2D g2d = (Graphics2D) g;
			g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
			System.out.println("drin2");
			super.paint(g2d);
		}
		else
		{
			super.paint(g);
		}
	}
}
```

Ich habe jetzt jeweils die Paint() und paintComponent() Methoden überschrieben
leider nicht mit Erfolg wie es scheint :noe:

Ich möchte halt das nur das HintergundPanel durchsichtig ist und das textPanel nicht


----------



## Nader (29. Sep 2009)

outbreaker hat gesagt.:


> ..
> Ich möchte halt das nur das HintergundPanel durchsichtig ist und das textPanel nicht



das Problem liegt daran, dass man durch setComposite() das Objekt Graphics manipuliert bzw. verändert. Dieses Objekt wird weiterverwenden, um die Komponenten des Panels zu zeichnen. Lösung wäre, dass man das weit unter (schon beim Renderen einer Komponente-> also bei L&F) macht. 

Such die Stelle, wo Hintergrund vom Panel gezeichnet wird (ich vermute mal PanelUI.paint()) und da kannst du Composite auf Graphics setzen.


----------



## Bartleby (29. Sep 2009)

Nader hat gesagt.:


> das Problem liegt daran, dass man durch setComposite() das Objekt Graphics manipuliert bzw. verändert. Dieses Objekt wird weiterverwenden, um die Komponenten des Panels zu zeichnen. Lösung wäre, dass man das weit unter (schon beim Renderen einer Komponente-> also bei L&F) macht.
> 
> Such die Stelle, wo Hintergrund vom Panel gezeichnet wird (ich vermute mal PanelUI.paint()) und da kannst du Composite auf Graphics setzen.



Oder einfach das alte Graphics-Object wiederherstellen:


```
@Override
            protected void paintComponent(Graphics g)
            {
                if (g instanceof Graphics2D) 
                {
 
                    Graphics2D g2d = (Graphics2D) g;
                    Composite oldComposite = g2d.getComposite();
                    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
                    System.out.println("drin3");
                    super.paintComponent(g2d);
                    g2d.setComposite(oldComposite);
                }
                else
                    super.paintComponent(g);
            }
        };
```


----------



## outbreaker (29. Sep 2009)

Bartleby hat gesagt.:


> Oder einfach das alte Graphics-Object wiederherstellen:


Welche paintComponent(Graphics g) hast du jetzt so überschrieben?
Also bei welcher muss ich das machen das er das wiederherstellt?


----------



## Nader (29. Sep 2009)

Bartleby hat gesagt.:


> Oder einfach das alte Graphics-Object wiederherstellen:



das wird natürlich nicht helfen, weil super.paintComponent() schon mit veränderten Graphics arbeitet!

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
*super.paintComponent(g2d);*
g2d.setComposite(oldComposite);

Leider wird im Swing das Graphics Object nicht geklont, sondern nur kopiert! und genau das ist das Problem.???:L


----------

