Eigenes durchsichtiges JFrame

Jellysheep

Erfahrenes Mitglied
Hi,
mit dem Code habe ich versucht, ein "durchsichtiges" JFrame anzuzeigen, das nicht die AWTUtilities verwendet:
Java:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.event.MouseInputListener;


public class TransparentFrame extends JFrame{
    BufferedImage bg;
    public TransparentFrame() throws AWTException{
        super("TransparentFrame");
        setSize(200, 200);
        bg = new Robot().createScreenCapture(new Rectangle(1024, 768));
        setUndecorated(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setListener();
        setVisible(true);
    }
    void setListener() {
        MouseInputListener handler = new MouseInputListener() {
            java.awt.Point offset;

            @Override
            public void mouseClicked(MouseEvent arg0) {
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
            }

            @Override
            public void mouseExited(MouseEvent arg0) {
            }

            @Override
            public void mousePressed(MouseEvent arg0) {
                offset = arg0.getPoint();
                repaint();
            }

            @Override
            public void mouseReleased(MouseEvent arg0) {
                repaint();
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                Point where = e.getPoint();
                where.translate(-offset.x, -offset.y);
                Point loc = getLocationOnScreen();
                loc.translate(where.x, where.y);
                setLocation(loc);
                paint(getGraphics());
            }

            @Override
            public void mouseMoved(MouseEvent arg0) {
            }
        };
        addMouseListener(handler);
        addMouseMotionListener(handler);
    }
    public void paint(Graphics g){
        java.awt.Point p = getLocation();
        g.drawImage(bg, 0, 0, getWidth(), getHeight(), p.x, p.y, p.x+getWidth(), p.y+getHeight(), null);
        g.drawRect(0, 0, getWidth()-1, getHeight()-1);
    }
    public static void main(String [] args){
        try {
            new TransparentFrame();
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
}

Leider ruckelt das JFrame beim Verschieben.
Kann man irgendetwas anders programmieren, sodass es nicht mehr ruckelt?
 
Zuletzt bearbeitet von einem Moderator:
Hi!

Ich verstehe jetzt gerade den Sinn nicht, ein Fenster transparent zu machen - will man das denn gar nicht sehen?

Naja, wahrscheinlich hilft dir das hier weiter!

EDIT:

mit dem Code habe ich versucht, ein "durchsichtiges" JFrame anzuzeigen, das nicht die AWTUtilities verwendet:

Okay, vergiss das Ganze =) Trotzdem: Warum braucht man ein durchsichtiges Fenster, und warum will man die AWTUtils nicht dafür nutzen?

Gruß,

RoCMe
 
Zuletzt bearbeitet:
Danke für den Link, doch das möchte ich nicht verwenden.
Das Fenster soll erst einmal transparent sein, letztendlich soll der Hintergrund einen Blur-Effekt bekommen, also wie ein Fenster mit Aero-Effekten aussehen.
Das funktioniert auch relativ gut, aber der Hintergrund ruckelt ein bisschen.

Jetzt habe ich aber eine Lösung gefunden:
Ein transparentes (mit AWTUtilities) JFrame über den ganzen Bildschirm und nur das eigentliche Fenster zeichnen:
Java:
import java.awt.AWTException;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;

import javax.swing.JFrame;
import javax.swing.event.MouseInputListener;

public class TransparentFrame extends JFrame {
	BufferedImage bg;
	Point p = new Point(0, 0);
	int width = 300, height = width, blur = 20;
	long time = 0;

	public TransparentFrame() throws AWTException {
		super("TransparentFrame");
		setSize(1024, 738);
		setLocation(0, 0);
		bg = blur(new Robot().createScreenCapture(new Rectangle(1024, 768)),
				blur);
		setUndecorated(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setListener();
		try {
			if (com.sun.awt.AWTUtilities
					.isTranslucencySupported(com.sun.awt.AWTUtilities.Translucency.TRANSLUCENT)) {
				com.sun.awt.AWTUtilities.setWindowOpaque(this, false);
			} else {
				System.exit(0);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		setVisible(true);
	}

	private BufferedImage blur(BufferedImage bi, int x) {
		BufferedImage bi2 = new BufferedImage(bi.getWidth(), bi.getHeight(), bi
				.getType());
		int b = 2;
		float value = 1f / (b * b);
		float[] matrix = new float[b * b];
		for (int i = 0; i < b * b; i++) {
			matrix[i] = value;
		}
		BufferedImageOp op = new ConvolveOp(new Kernel(b, b, matrix));
		for (int i = 0; i < x; i++) {
			op.filter(bi, bi2);
			if (i < x - 1) {
				bi = bi2;
				bi2 = new BufferedImage(bi.getWidth(), bi.getHeight(), bi
						.getType());
			}
		}
		return bi2;
	}

	void setListener() {
		MouseInputListener handler = new MouseInputListener() {
			java.awt.Point offset;

			@Override
			public void mouseClicked(MouseEvent arg0) {
			}

			@Override
			public void mouseEntered(MouseEvent arg0) {
			}

			@Override
			public void mouseExited(MouseEvent arg0) {
			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				offset = new Point(arg0.getPoint().x - p.x, arg0.getPoint().y
						- p.y);
				repaint();
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
				repaint();
			}

			@Override
			public void mouseDragged(MouseEvent e) {
				Point where = e.getPoint();
				where.translate(-offset.x, -offset.y);
				p = new Point(where.x, where.y);
				long t = System.currentTimeMillis();
				if (t - time > 10) {
					repaint();
					time = t;
				}
			}

			@Override
			public void mouseMoved(MouseEvent arg0) {
			}
		};
		addMouseListener(handler);
		addMouseMotionListener(handler);
	}

	public void paint(Graphics g) {
		g.drawImage(bg, p.x, p.y, p.x + width, p.y + height, p.x + blur / 2,
				p.y + blur / 2, p.x + width + blur / 2,
				p.y + height + blur / 2, null);
		g.drawRect(p.x, p.y, width, height);
	}

	public static void main(String[] args) {
		try {
			new TransparentFrame();
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}
}

Das funktioniert, wie man hier sieht:

Screenshot2.JPG

Bei mir bleibt beim Verschieben manchmal die Maus hängen. Kannst du bzw. könnt ihr das ausprobieren, ob das nur an meinem Rechner liegt, oder ob das Fenster bei euch auch hängen bleibt?
 
hmm ... ich habs mir angekuggt und war enttäuscht
denn wenn du *mal davon abgesehen* das hintere frame wirklich über den gesamten sichtbaren bereich erstreckst *ein festes 1024x768 würde ich hier nicht nehmen* hast du NICHT die möglichkeit auf dahinterliegende fenster zu klicken *was bei 100% größe sogar den zugriff auf die taskleiste sperrt*
davon abgesehen hast du einen re-paint fehler ... du solltest wenn du es wirklich so machen willst erstmal den hintergrund komplett löschen bevor du es neu zeichnest denn hast du schon mal das fenster verschoben ? ... der schwarze rahmen verschmiert ... von daher > implementierung fehlerhaft
warum du aller dings keine com.sun.* - klassen willst kann ich sehr gut verstehen ...
 
Zurück