Announcement

Collapse
No announcement yet.

Transparenz eines JWindow ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Transparenz eines JWindow ?

    Hallo,

    ist es möglich den Hintergrund eines JWindow auf durchsichtbar einzustellen. Methoden wie "setOpaque" sind nicht vorhanden. Also das Fenster soll die Fläche nicht gefüllt haben, sondern beim verschieben muessen die darunterliegenden Elemente sichtbar sein, sofern kein Steuerelement auf dem JWindow liegt.

    Gruss

    Marc-André

  • #2
    Kannst Du das genauer erklären? Ich hätte eher vermutet, dass man<br>
    einen undurchsichtigen Hintergrund (z.B. ein Bild) hat und die<br>
    Komponenten, die man dann in den Container einbaut sind mit <br>
    setOpaque(false) durchsichtig, so dass der Hintergrund durchscheint...
    <p>
    Klau

    Comment


    • #3
      Hallo,

      etwas genauer erklärt: Ich habe eine Komponente implementiert die wie eine Sprachblase aussieht (eine JTextArea die sich als RoundRect.. zeichnet usw.) Diese Komponente erscheint über einen rechten Statusbar Eintrag wenn beispielwseise die Datenbankverbindung abbricht oder eine neue eMail eingetroffen ist. Die Sprechblase ist auf einem JWindow und zur Zeit ist die Hitergrundfarbe gleich dem Desktop-Container, liegt aber nun ein anderes Fenster in dem Bereich in dem die Sprechblase erscheint, sieht man natürlich das JWindow auf dem sie liegt. Ich hoffe es ist etwar klarer geworden was sich meine.

      Gruss
      Marc-Andr&#233

      Comment


      • #4
        Hallo Marc-Andre,<br>
        JWindow ist eine heavyweight component, basierend auf dem unterliegenden<br>
        Betriebssystem. Transparenz mit Java-Mitteln ist hier NICHT vorgehsehen!<br>
        Du kannst jedoch einen Trick anwenden und die Illusion einer<br>
        Transparenz erzeugen. Ich habe dafür einen Beispielcode geschrieben.
        Das Ganze funktioniert erst ab JDK1.3!
        <pre><code>
        import java.awt.*;
        import java.awt.image.BufferedImage;
        import java.awt.event.*;
        import javax.swing.*;

        public class TransparentWindow extends JWindow {

        public TransparentWindow() {
        setSize(400,400);
        centerOnScreen(this);
        // capture background before we add components;
        // we need JWindows's size here and component's location must also have been done!
        BackgroundPanel backgroundPanel = new BackgroundPanel(this);
        JButton closeButton = new JButton("Close");
        closeButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        TransparentWindow.this.setVisible(false);
        TransparentWindow.this.dispose();
        System.exit(0);
        }
        });
        backgroundPanel.add(closeButton);
        getContentPane().add(backgroundPanel);
        }

        private void centerOnScreen(Container c) {
        Dimension paneSize = c.getSize();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        c.setLocation((screenSize.width - paneSize.width) / 2,
        (screenSize.height - paneSize.height) / 2);
        }

        private class BackgroundPanel extends JPanel {

        BufferedImage image = null;

        BackgroundPanel(JWindow window) {
        Rectangle rect = window.getBounds();
        try {
        image = new Robot().createScreenCapture(rect);
        }
        catch (AWTException e) {
        throw new RuntimeException(e.getMessage());
        }
        }

        protected void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, this);
        }
        }

        public static void main(String[] argv) {
        new TransparentWindow().show();
        }
        }
        </pre></code>
        Lass mal von Dir hören, ob es für Deine Anwendung geklappt hat.
        <p>
        Klau

        Comment


        • #5
          Hallo,

          ja super: Funktioniert hervorragend. Der einzige Nachteil ist
          natürlich, falls ein Benutzer ein Fenster darunterherschiebt, sieht
          man die Mogelei auch, aber da die Sprechblasen sowieso wieder nach
          5 sec. automatisch geschlossen werden, sollte dies kein Problem darstellen.

          Vielen Dank für diese Idee.

          Gruss
          Marc-Andr&#233

          Comment

          Working...
          X