You are not logged in.

  • Login

1

Saturday, July 21st 2007, 2:22am

aktueller Hintergrund

Hi,

bin gerade dabei, durchsichtige Komponenten zu bauen -in Java-; das Prinzip funktionierrt schon mal, aber die Details sind nur nativ zu lösen...

Also, eigentlich ist meine Komponente nicht wirklich durchsichtig, sondern zeichnet einfach immer den entsprechenden Ausschnitt des Hintergrundes, alles andere kommt dann drüber.

Das Problem : Wenn ich das Ding starte, haut alles hin; verändert sich jedoch der Hintergrund, während das Fenster noch offen ist, stimmt natürlich die Hintergrundzeichnung nicht mehr und die "Durchsichtigkeit" ist dahin.
Den Hintergrund besorge ich mir per Robot#createScreenShot() bevor das Fenster sichtbar gemacht wird, bzw. (letzte JavaMöglichkeit) beim windowIconified- Event...
Ergo, ich bräuchte den aktuellen Inhalt des Monitors -OHNE DAS FENSTER SELBST.

Ich bin komplett ratlos.

Wie kann man den aktuellen Fensterinhalt + DAS WAS HINTER DER ZIELANWENDUNG LIEGT bekommen ?
Geht das ?
Geht das in C ? (Hab nun endlich etwas nen Plan davon)

Gibt es Alternativen ? (besser: welche)

Für interessierte mal hier ein Stück Code zum Ausprobieren oder Lesen-
zeigt wohl am besten, worum es geht:

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
 
@SuppressWarnings("serial")
public class GlassComponent
extends JComponent
{
	public static void main(String... args)
	{
		final JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(440, 300);
		f.add(new GlassComponent(f));
		f.setVisible(true);
	}
 
	private static final Font font = new Font("SansSerif", Font.BOLD + Font.ITALIC, 65);
	private static final AlphaComposite composite = 
		AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f);
 
	private Image background;
	private Frame target;
 
	public GlassComponent(final Frame target)
	{
		this.target = target;
		loadBackground();
		addListeners();
	}
	private void addListeners()
	{
		target.addComponentListener(new ComponentAdapter(){
			public void componentMoved(final ComponentEvent e)
			{
				repaint();
			}});
		target.addWindowListener(new WindowAdapter(){
			public void windowIconified(final WindowEvent e)
			{
				loadBackground();
			}});
	}
	private void loadBackground()
	{
		try
		{
			final Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
			background = new Robot().createScreenCapture(new Rectangle(0, 0, d.width, d.height));
		}
		catch(AWTException e){System.out.println(e.getStackTrace());}
	}
	@Override
	protected void paintComponent(final Graphics graphics)
	{
		final String test = "hier ist der Inhalt";
		final Graphics2D g = (Graphics2D)graphics;
		final Insets in = target.getInsets();
		final Point location = target.getLocationOnScreen();
		g.drawImage(background, -in.left - location.x, -in.top - location.y, null);
		g.setComposite(composite);
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g.setFont(font);
		final FontMetrics fm = g.getFontMetrics();
		final Dimension size = getSize();
		g.drawString(test, size.width/2 - fm.stringWidth(test)/2, size.height/2 + fm.getAscent()/2);
	}
}

2

Saturday, July 21st 2007, 8:37am

Das sieht ja schon ziemlich cool aus!
Für die die sich nicht drunter vorstellen können, habe ich mal einen Screenshot angehängt.

Wie du das perfektionierst erfährst du im O'REILLY Hack #41:
"Hacking Swing: Translucent Windows"
http://www.onjava.com/pub/a/onjava/excerpt/swinghks_hack41/index.html?page=2

Dort erfährst du auch wie du Rahmen und Windowbar ausschaltest (eigentlilch ganz simpel -> setUndecorated(true)) um eine komplett transparent wirkende Applikation zu erhalten.
Torben Brodt has attached the following image:
  • screenshot-java.png

3

Saturday, July 21st 2007, 5:38pm

super Link

besten Dank :)

Social bookmarks