aktueller Hintergrund

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

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

      33,49 kB, 610×259, 245 mal angesehen