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:
Alles anzeigen
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:
Quellcode
- 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);
- }
- }