Window transparent, Komponenten nicht transparent

Nioukie

Mitglied
Hi Leute,

ich möchte wie der Titel schon sagt auf meinem halbtransparenten Fenster nicht-transparente Komponenten platzieren. Leider wird das ganze Fenster inklusive Komponenten halbtransparent. Dass es gehn muss zeigt dieses Beispiel: http://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows/#Setting-the-Shape-of-a-Window

In Figure 10 sieht man dass das Fenster halbtransparent und der Button nicht transparent ist. Genau so soll mein Fenster auch aussehen. Solange ich mir den Code aber auch anschaue bzw. damit experimentiere, ich verstehe nicht welcher Teil das Fenster so aussehen lässt.

Kann mir jemand helfen? Ich habe das Gefühl ich stehe direkt vor der Lösung aber scheinbar bin ich blind. ???:L

Edit: Ich habe den Beitrag http://www.java-forum.org/awt-swing-swt/103622-shaped-translucent-windows.html schon gesehen, der hilft mir aber leider nicht weiter weil ich ja mein Window HALBtransprarent machen will. Ich habe es schon geschafft das Window komplett transparent zu machen und nur die Komponente anzuzeigen, aber es soll eben halbtranparent sein.
 
Zuletzt bearbeitet:
Also hiermit wird beides (Window und Komponente) transparent:

Java:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class TranslucencyWindow extends JFrame  {
	private Container cp;
	private Shape shape;

	public TranslucencyWindow() {

		//Init Window
		setUndecorated(true);
		com.sun.awt.AWTUtilities.setWindowOpacity(this, .85f);
		cp = getContentPane();

		//Init Components
		ImageIcon i = new ImageIcon(getClass().getResource("/Pictures/basic_window.gif"));
		JLabel j = new JLabel(i);
		j.setBounds(0, 0, i.getIconWidth(), i.getIconHeight());
		j.setOpaque(true);      //hat keine ersichtliche Wirkung 
		
		cp.add(j);
		setSize(800,800);
		setVisible(true);
	}	
	
	public static void main(String[]args){
		TranslucencyWindow d = new TranslucencyWindow();
	}
}


Wenn ich den Code so umschreibe, ist das Fenster komplett transparent und nurnoch die Komponente zu sehen:

Java:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class TranslucencyWindow extends JFrame  {
	private Container cp;
	private Shape shape;

	public TranslucencyWindow() {

		//Init Window
		setUndecorated(true);
//		com.sun.awt.AWTUtilities.setWindowOpacity(this, opacity);
		com.sun.awt.AWTUtilities.setWindowOpaque(this, false);
		cp = getContentPane();

		//Init Components
		ImageIcon i = new ImageIcon(getClass().getResource("/Pictures/basic_window.gif"));
		JLabel j = new JLabel(i);
		j.setBounds(0, 0, i.getIconWidth(), i.getIconHeight());
//		j.setOpaque(true);
		
		cp.add(j);
		setSize(800,800);
		setVisible(true);
	}	
	
	public static void main(String[]args){
		TranslucencyWindow d = new TranslucencyWindow();
	}
}

}

Ich brauche aber eine Mischung aus beiden, also Komponente undurchsichtig, Fenster halbtransparent.
 
Auf die Weise hatte ichs schonmal probiert, ohne Erfolg, aber durch den von dir geposteten Link hab ich auch endlich kapiert warum... Für die Per-Pixel-Translucency braucht man JDK 7 und ich hatte nur JDK 6... Danke danke danke eeendlich funktionierts :applaus:
 
Oh ich seh grade ich hab da noch ein Problem :/

Ich möchte den Effekt auf ein "selbst geformtes" Fenster anwenden... Leider erhalte ich mit der Methode setBackground wieder ein rechteckiges Fenster... Hat jemand noch ne Idee wie ich das am geschicktesten lösen könnte?


Hier mein Code:

Java:
package audioplayer;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.*;
import java.io.File;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.sun.awt.AWTUtilities;
import javax.media.*;


public class Display extends JFrame  {
	private Container cp;
	private Shape shape;
	
	private JButton testbutton;
	
	public Display(){		
		
		//Init Window
		setUndecorated(true);
        Color back = getBackground();
        setBackground(new Color(back.getRed(), back.getGreen(), back.getBlue(), 128));
        initWindowShape();
			
		cp = getContentPane();
		testbutton = new JButton("Test");
		cp.add(testbutton);
		
		setSize(800,800);
		setVisible(true);
	}	
	
	
	private void initWindowShape()
	{
		GeneralPath myPath = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
		myPath.moveTo(0, 600);
		myPath.quadTo(0, 0, 500, 0);
		myPath.lineTo(600, 0);
		myPath.quadTo(600, 600, 0, 600);
		myPath.closePath();
		
		AffineTransform af = new AffineTransform();
		shape = myPath.createTransformedShape(af);
		shape = af.createTransformedShape(shape);

		
		com.sun.awt.AWTUtilities.setWindowShape(this, shape);
	}


	public static void main(String[]args){
		Display d = new Display();
	}
}
 
Zuletzt bearbeitet:
Schnell mal in Netbeans zusammengeklickt und deinen Code eingefügt. Funktioniert wunderbar.

Java:
import java.awt.Color;
import java.awt.Shape;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import javax.swing.JFrame;

public class J2dFrame extends JFrame {

    public J2dFrame() {
        setUndecorated(true);
        Color back = getBackground();
        setBackground(new Color(back.getRed(), back.getGreen(), back.getBlue(), 128));
        addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                GeneralPath myPath = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
                myPath.moveTo(0, 600);
                myPath.quadTo(0, 0, 500, 0);
                myPath.lineTo(600, 0);
                myPath.quadTo(600, 600, 0, 600);
                myPath.closePath();

                AffineTransform af = new AffineTransform();
                Shape shape = myPath.createTransformedShape(af);
                shape = af.createTransformedShape(shape);
                setShape(shape);
            }
        });
        initComponents();
    }

    private void initComponents() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 679, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 614, Short.MAX_VALUE)
        );

        pack();
    }
}
 
Danke dass du mir so viel hilfst! Leider funktioniert dein Code bei mir aber nicht, hab ihn in Eclipse reinkopiert, die Klasse instanziiert und setvisible(true) gesetzt aber es wird wieder ein rechteck und nicht die Mandelform 🙁 Wie kann das sein??

Edit: Sobald ich setBackground auskommentiere, ist meine Form wieder zu sehn, allerdings eben wieder nicht transparent ...
 
Zuletzt bearbeitet:
Habs jetzt endlich geschafft, dein Code funktioniert natürlich einwandfrei, hatte übersehen dass ich nicht nur das Default JDK umstellen, sondern es auch im bestehenden Projekt ändern muss 😳

(Falls jemand später mal mit dem selben Problem auf diesen Thread stößt: Rechtsklick auf das Projekt > Properties > Java Build Path > Libraries dort das Alte mit Remove entfernen und das neue JDK via Add Library > JRE System Library > Workspace Default einstellen )

Vielen Dank nochmal für die Hilfe 🙂
 

Zurück
Oben