# Frage zur GlassPane



## Cole (5. Jul 2006)

Hi, 
ich will machen, dass man auf die Buttons meines Programms nicht mehr draufklicken kann, aber dass sie trotzdem noch zu sehen sind. 
Gut, dann nehme ich eine GlassPane (hab ein Beispielcode wo das funktioniert). 
Hab dann was geschrieben, nur ein Frame, die ContentPane, eine Panel und den Button, also ganz simpel. 
Aber ich weiss nicht wie ich die GlassPane draufbekomme. Hoffe ihr könnt mir helfen: 
(Das Teil ist zT mit dem VisualEditor erstellt, also nicht erschrecken)

```
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import javax.swing.JButton; 

public class HH 
{ 

  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="170,65" 
  private JPanel jContentPane = null; 
  private JPanel jPanel = null; 
  private JButton jButton = null; 
  JPanel glass = new JPanel(new GridLayout(0,1)); 



  private JFrame getJFrame ( ) 
  { 
    if (jFrame == null) 
    { 
      jFrame = new JFrame ( ); 
      jFrame.setSize(new java.awt.Dimension(411,219)); 
      jFrame.setContentPane(getJContentPane()); 
      jFrame.setVisible(true); 
    } 
    return jFrame; 
  } 



  private JPanel getJContentPane ( ) 
  { 
    if (jContentPane == null) 
    { 
      jContentPane = new JPanel ( ); 
      jContentPane.setLayout(new BorderLayout()); 
      jContentPane.add(getJPanel(), java.awt.BorderLayout.CENTER); 
    } 
    return jContentPane; 
  } 



  private JPanel getJPanel ( ) 
  { 
    if (jPanel == null) 
    { 
      jPanel = new JPanel ( ); 
      jPanel.setLayout(new BorderLayout()); 
      jPanel.add(getJButton(), java.awt.BorderLayout.NORTH); 
    } 
    return jPanel; 
  } 



  private JButton getJButton ( ) 
  { 
    if (jButton == null) 
    { 
      jButton = new JButton ( ); 
      jButton.setText("hjdfj#"); 
    } 
    return jButton; 
  } 

  public void createGlass(){ 



    glass.setOpaque(false); 
    glass.add(jContentPane); 
    jFrame.setGlassPane(glass); 
    glass.setVisible(true); 

  } 

public static void main(String[] args){ 
  HH hh = new HH(); 
  hh.getJFrame(); 
  hh.createGlass(); 



} 
}
```


----------



## Beni (5. Jul 2006)

Das ContentPane muss nicht dem GlassPane hinzugefügt werden, wenn schon umgekehrt.

Events können bei Swing-Komponenten "durchfallen", ein zusätzlicher MouseListener sollte das verhindern:

```
public void createGlass() {

        glass.setOpaque(false);
        glass.addMouseListener( new MouseAdapter(){});
        jFrame.setGlassPane(glass);
        glass.setVisible(true);

    }
```


----------



## Cole (5. Jul 2006)

Hmm, das funktioniert leider nicht.
Kannst du mir das evtl. genauer erklären, was ich wo machen muss?
Sollte eigentlich ja alles abdecken, also auf das "oberste" Panel ( wo alle Buttons und anderen Panels drinliegen) die glassPane drauf.
Ich hab da auch bei google nichts gefunden was mir weiterhilft.


----------



## Beni (5. Jul 2006)

Bei mir funktionierts, hast du vielleicht eine andere Java-Version? Ich habe Version 1.5.


----------



## Brainiac (5. Jul 2006)

warum nimmst du nicht die funktion des JButton.setEnabled(false) ???  ???:L


----------



## Cole (5. Jul 2006)

Beni hat gesagt.:
			
		

> Bei mir funktionierts, hast du vielleicht eine andere Java-Version? Ich habe Version 1.5.



Du meinst, wenn du den Code oben kompilierst dann funktioniert es korrekt? Wenn ich das mache, dann sind die Buttons plötzlich nicht mehr links sondern unten in der Mitte und klicken kann man sie immer noch.



> warum nimmst du nicht die funktion des JButton.setEnabled(false) ??? icon_scratch.gif


Ja, das ich die Buttons disablen kann ist schon klar. Aber dann sind die doch in so nem Hässlichen grau, und ausserdem will ich ja auch nicht 30 Buttons disablen.
Wenn die Glasspane draufliegt hab ich beides: schönes Design und man kann nix mehr klicken.


----------



## Brainiac (5. Jul 2006)

Wäre für mich als user nur etwas verwunderlich wenn ich den Button dann nicht anklicken kann. Aber vielleicht ergibt sich das ja dann bei dir.
für 30 Buttons schreibt man sich halt entweder ne Funktion setAllButtonsEnabel(boolean b) die das dann übernimmt oder man packt die Button in ein Button-Array und nimmt dann ne for-schleife.


----------



## Beni (5. Jul 2006)

> Du meinst, wenn du den Code oben kompilierst dann funktioniert es korrekt? Wenn ich das mache, dann sind die Buttons plötzlich nicht mehr links sondern unten in der Mitte und klicken kann man sie immer noch.



Hast du auch alles richtig kopiert?

```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class HH {

    private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="170,65"

    private JPanel jContentPane = null;

    private JPanel jPanel = null;

    private JButton jButton = null;

    JPanel glass = new JPanel(new GridLayout(0, 1));

    private JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setSize(new java.awt.Dimension(411, 219));
            jFrame.setContentPane(getJContentPane());
            jFrame.setVisible(true);
        }
        return jFrame;
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getJPanel(), java.awt.BorderLayout.CENTER);
        }
        return jContentPane;
    }

    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(new BorderLayout());
            jPanel.add(getJButton(), java.awt.BorderLayout.NORTH);
        }
        return jPanel;
    }

    private JButton getJButton() {
        if (jButton == null) {
            jButton = new JButton();
            jButton.setText("hjdfj#");
        }
        return jButton;
    }

    public void createGlass() {

        glass.setOpaque(false);
        glass.addMouseListener( new MouseAdapter(){});
        jFrame.setGlassPane(glass);
        glass.setVisible(true);

    }

    public static void main( String[] args ) {
        HH hh = new HH();
        hh.getJFrame();
        hh.createGlass();

    }
}
```









> Ja, das ich die Buttons disablen kann ist schon klar. Aber dann sind die doch in so nem Hässlichen grau, und ausserdem will ich ja auch nicht 30 Buttons disablen.
> Wenn die Glasspane draufliegt hab ich beides: schönes Design und man kann nix mehr klicken.


Und der Benutzer wird vor Wut die Wand raufklettern, weil die Buttons nicht reagieren... (logische Schlussfolgerung des Users: das Programm ist defekt, der Cole ein Stümper :wink: ...)


----------



## Cole (6. Jul 2006)

@ Beni:
Habs nochmal rauskopiert jetzt gehts. Muss nachher mal schauen was ich da falsch gemacht hab. :/
Danke dir!

@ Brainiac: Die buttons fungieren in dem Project was ich mache nicht als wirkliche Buttons, sonder mehr als Statusanzeigen (on/off zum Beispiel). Deswegen die GlassPane. Es soll schliesslich alles schön und einheitlich aussehen.

Die GLassPane ermöglicht es mir, dass ich bestimmte Buttons (=Statusanzeigen) abschalte, sie aber schön aussehen und manche bleiben gescheite Buttons. Hoffe das war einigermassen verständlich, weiss nicht wie ich das  besser erklären soll.

[Edit]:
Kann man die Glasspane auch über ein einzelnes Panel legen?
jPanel.setGlassPane(glass) geht nicht, aber jFrame.setGlassPane(glass) schon.
Oder mach ich grad nen Denkfehler?


----------



## Brainiac (6. Jul 2006)

Cole hat gesagt.:
			
		

> @ Brainiac: Die buttons fungieren in dem Project was ich mache nicht als wirkliche Buttons, sonder mehr als Statusanzeigen (on/off zum Beispiel). Deswegen die GlassPane. Es soll schliesslich alles schön und einheitlich aussehen.
> 
> Die GLassPane ermöglicht es mir, dass ich bestimmte Buttons (=Statusanzeigen) abschalte, sie aber schön aussehen und manche bleiben gescheite Buttons. Hoffe das war einigermassen verständlich, weiss nicht wie ich das  besser erklären soll.



Also man sollte die Dinger immer für dsa benutzen für das sie gedacht sind. Ein Button zum drauf klicken. Ein Label um was anzuzeigen. Ein Textfeld um was einzugeben. Der User erkennt ja was dort benutzt wurde, vor allem da Du ja Wert drauf legst, das der Button auch wie ein Button aussieht. Wenn er dann nicht mehr wie einer funktioniert wird das intuitive Verständniss für Dein Programm doch recht schnell zerstört und der User denkt sich was soll das denn hier, für ein mist sein. Es gibt halt nicht umsonst JButtons, JPanels, JLabels usw...


----------



## Cole (6. Jul 2006)

Ok, ich versuchs nochmal anders:
Am Ende wird es so sein, dass immer 2 Buttons genau über einander liegen (zB oben on unten off). Der User hat da nix einzugeben, das wird alles im Hintergrund gemacht, das ist nur dazu da um den Status zu sehen. Aktivierter Button = gelb und "reingedrückt", der inaktive das Standradblau und draussen.
Das würde so mit Labeln nicht funktionieren.


----------



## Beni (6. Jul 2006)

GlassPanes sind eine Eigenschaft des JRootPanes. Aber nichts hindert dich daran, ein unsichtbares Panel einer anderen Component hinzuzuadden (GlassPanes werden nicht besonders behandelt). Nur sollte dieses unsichtbare Panel die anderen Elemente überlappen, und auch "zu oberst" sein.


----------



## Cole (6. Jul 2006)

Ah, ok danke. Also GlassPanes nur bei Rootpanes.
Wie kann ich den ein durchsichtiges Panel erstellen?Kannst du mir da ein Beispiel machen?
Und mit dem ganz oben stehen: Also alle Komponenten dem durchsichtigen Panel adden?

[Edit]: Ich hab grad versucht eine GlassPane auf ein InternalFrame zu legen, aber irgendwie will das nicht so wie ich will. Kannst du dir das nochmal anschauen?


```
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.HierarchyBoundsAdapter;
import java.awt.event.HierarchyEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JButton;


import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JWindow;
import javax.swing.JInternalFrame;


public class Beispiel
{

  JPanel glass = new JPanel();
  private Point old_point = new Point(00,00);
  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="4,6"
  private JPanel jContentPane = null;
  private JPanel jPanel = null;
  private JButton jButton2 = null;
  private JPanel jPanel1 = null;

  private JButton jButton = null;
  private JDialog jDialog = null;  //  @jve:decl-index=0:visual-constraint="380,385"
  private JPanel jContentPane1 = null;
  private JPanel jPanel2 = null;
  private JButton jButton1 = null;
  private JPanel jPanel3 = null;
  private JPanel jPanel4 = null;
  private JLabel jLabel = null;
  private JPanel jPanel5 = null;
  private JInternalFrame jInternalFrame = null;
  private JPanel jContentPane2 = null;
  private JPanel jPanel6 = null;
  private JButton jButton3 = null;
  private JButton jButton4 = null;
  private JFrame getJFrame ( )
  {
    if (jFrame == null)
    {
      jFrame = new JFrame ( );
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jFrame.setSize(new java.awt.Dimension(445,317));
      jFrame.setTitle("Hallo,Testbild");

      jFrame.setContentPane(getJContentPane());
      jFrame.setVisible(true);



    }
    return jFrame;
  }


  private JPanel getJContentPane ( )
  {
    if (jContentPane == null)
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.setRows(1);
      jContentPane = new JPanel ( );
      jContentPane.setLayout(gridLayout);
      jContentPane.add(getJPanel(), null);
      jContentPane.add(getJPanel5(), null);
    }
    return jContentPane;
  }


  private JPanel getJPanel ( )
  {
    if (jPanel == null)
    {

      jPanel = new JPanel ( );
      jPanel.setLayout(new BorderLayout());
      jPanel.add(getJPanel1(), java.awt.BorderLayout.SOUTH);

    }
    return jPanel;
  }


  private JButton getJButton2 ( )
  {
    if (jButton2 == null)
    {
      jButton2 = new JButton ( );

      jButton2.setText("sdfsd");
      jButton2.setPreferredSize(new java.awt.Dimension(80,50));
      jButton2.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
         jDialog.setVisible(true);
        }
      });

    }
    return jButton2;
  }



  private JPanel getJPanel1 ( )
  {
    if (jPanel1 == null)
    {
      jPanel1 = new JPanel ( );
      jPanel1.add(getJButton2(), null);
      jPanel1.add(getJButton(), null);

    }
    return jPanel1;
  }


  private JButton getJButton ( )
  {
    if (jButton == null)
    {
      jButton = new JButton ( );
      jButton.setText("swdfsdf");
      jButton.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
          System.exit(0);
        }
      });
    }
    return jButton;
  }


  private JDialog getJDialog ( )
  {
    if (jDialog == null)
    {
      jDialog = new JDialog ( );
      jDialog.setSize(400,300);
      jDialog.setContentPane(getJContentPane1());
      jDialog.setVisible(false);
      jDialog.setResizable(false);

      jDialog.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter(){
        public void ancestorMoved(HierarchyEvent e)
        {
          cancelMouse(); // Deaktiviert die Mauseingabe
          if(old_point != null) {
            jDialog.setLocation(old_point);
          jDialog.validate();
          jDialog.repaint();
        }
        }
      });

    }
    return jDialog;
  }

  private void cancelMouse()
  {
    if(jDialog.isVisible()) //wird beim starten 1mal durchlaufen
    {
      try
      {
        Robot rb = new Robot();
        rb.mouseRelease(InputEvent.BUTTON1_MASK); //das man releasen kann
      }
      catch (Exception ex)
      {
        ex.printStackTrace(System.out);
      }
    }
  }

  private JPanel getJContentPane1 ( )
  {
    if (jContentPane1 == null)
    {
      jContentPane1 = new JPanel ( );
      jContentPane1.setLayout(new BorderLayout());
      jContentPane1.add(getJPanel2(), java.awt.BorderLayout.CENTER);

    }
    return jContentPane1;
  }


  private JPanel getJPanel2 ( )
  {
    if (jPanel2 == null)
    {
      jPanel2 = new JPanel ( );
      jPanel2.setLayout(new BorderLayout());
      jPanel2.add(getJPanel3(), java.awt.BorderLayout.NORTH);
      jPanel2.add(getJPanel4(), java.awt.BorderLayout.CENTER);
    }
    return jPanel2;
  }


  private JButton getJButton1 ( )
  {
    if (jButton1 == null)
    {
      jButton1 = new JButton ( );
      jButton1.setText("456");

    }
    return jButton1;
  }






  private JPanel getJPanel3 ( )
  {
    if (jPanel3 == null)
    {
      File bild = new File("U:/titlebar_2.jpg");

      JLabel jLabel = null;
      try
      {
       jLabel = new JLabel(new ImageIcon(ImageIO.read(bild)));

        jPanel3 = new JPanel ( );
        jPanel3.add(jLabel);
      }
      catch (IOException e)
      {

        e.printStackTrace();
      }


    }

    return jPanel3;
  }



  private JPanel getJPanel4 ( )
  {
    if (jPanel4 == null)
    {
      jPanel4 = new JPanel ( );
      jPanel4.add(getJButton1(), null);
    }
    return jPanel4;
  }



  private JPanel getJPanel5 ( )
  {
    if (jPanel5 == null)
    {
      jPanel5 = new JPanel ( );
      jPanel5.setLayout(new BorderLayout());
      jPanel5.add(getJInternalFrame(), java.awt.BorderLayout.CENTER);
    }
    return jPanel5;
  }




  private JInternalFrame getJInternalFrame ( )
  {
    if (jInternalFrame == null)
    {
      jInternalFrame = new JInternalFrame ( );
      jInternalFrame.setName("");
      jInternalFrame.setTitle("Ein InternalFrame");
      jInternalFrame.setVisible(true);
      jInternalFrame.setContentPane(getJContentPane2());
    }
    return jInternalFrame;
  }



  private JPanel getJContentPane2 ( )
  {
    if (jContentPane2 == null)
    {
      jContentPane2 = new JPanel ( );
      jContentPane2.setLayout(new BorderLayout());
      jContentPane2.add(getJPanel6(), java.awt.BorderLayout.SOUTH);
    }
    return jContentPane2;
  }



  private JPanel getJPanel6 ( )
  {
    if (jPanel6 == null)
    {
      jPanel6 = new JPanel ( );
      jPanel6.add(getJButton3(), null);
      jPanel6.add(getJButton4(), null);
    }
    return jPanel6;
  }



  private JButton getJButton3 ( )
  {
    if (jButton3 == null)
    {
      jButton3 = new JButton ( );
      jButton3.setText("Button");
    }
    return jButton3;
  }



  private JButton getJButton4 ( )
  {
    if (jButton4 == null)
    {
      jButton4 = new JButton ( );
      jButton4.setText("Nocheiner");
    }
    return jButton4;
  }

  public void createGlass(){

    glass.addMouseListener( new MouseAdapter(){});
    glass.setOpaque(false);
    // jFrame.setGlassPane(glass);
    jInternalFrame.setGlassPane(glass);
    glass.setVisible(true);

  }
  public static void main (String [ ] args)
  {

      Beispiel beispiel = new Beispiel();
      beispiel.getJFrame();
      beispiel.getJDialog();
      beispiel.createGlass();




  }
}
```

Zeile 294 und 362.

[edit]: Also kurz und knackig: Wie legt man eine GlassPane auf einen InernalFrame? So wie beim "normalen" Frame funzt es leider nicht.


----------



## Beni (6. Jul 2006)

WTF? Ich bekomme nur eine Exception, dass irgendein Bild nicht geladen werden kann. Vereinfach das "Beispiel" mal soweit, dass man das auch ausführen kann :wink:

Mach ein KSKB


----------



## Cole (7. Jul 2006)

So, das Bild ist weg, sorry da hatte ich gestern nicht mehr dran gedacht!


```
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.HierarchyBoundsAdapter;
import java.awt.event.HierarchyEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JButton;


import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JWindow;
import javax.swing.JInternalFrame;


public class Beispiel
{

  JPanel glass = new JPanel();
  private Point old_point = new Point(00,00);
  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="4,6"
  private JPanel jContentPane = null;
  private JPanel jPanel = null;
  private JButton jButton2 = null;
  private JPanel jPanel1 = null;

  private JButton jButton = null;
  private JDialog jDialog = null;  //  @jve:decl-index=0:visual-constraint="380,385"
  private JPanel jContentPane1 = null;
  private JPanel jPanel2 = null;
  private JButton jButton1 = null;
  private JPanel jPanel3 = null;
  private JPanel jPanel4 = null;
  private JLabel jLabel = null;
  private JPanel jPanel5 = null;
  private JInternalFrame jInternalFrame = null;
  private JPanel jContentPane2 = null;
  private JPanel jPanel6 = null;
  private JButton jButton3 = null;
  private JButton jButton4 = null;
  private JFrame getJFrame ( )
  {
    if (jFrame == null)
    {
      jFrame = new JFrame ( );
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jFrame.setSize(new java.awt.Dimension(445,317));
      jFrame.setTitle("Hallo,Testbild");

      jFrame.setContentPane(getJContentPane());
      jFrame.setVisible(true);



    }
    return jFrame;
  }


  private JPanel getJContentPane ( )
  {
    if (jContentPane == null)
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.setRows(1);
      jContentPane = new JPanel ( );
      jContentPane.setLayout(gridLayout);
      jContentPane.add(getJPanel(), null);
      jContentPane.add(getJPanel5(), null);
    }
    return jContentPane;
  }


  private JPanel getJPanel ( )
  {
    if (jPanel == null)
    {

      jPanel = new JPanel ( );
      jPanel.setLayout(new BorderLayout());
      jPanel.add(getJPanel1(), java.awt.BorderLayout.SOUTH);

    }
    return jPanel;
  }


  private JButton getJButton2 ( )
  {
    if (jButton2 == null)
    {
      jButton2 = new JButton ( );

      jButton2.setText("sdfsd");
      jButton2.setPreferredSize(new java.awt.Dimension(80,50));
      jButton2.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
         jDialog.setVisible(true);
        }
      });

    }
    return jButton2;
  }



  private JPanel getJPanel1 ( )
  {
    if (jPanel1 == null)
    {
      jPanel1 = new JPanel ( );
      jPanel1.add(getJButton2(), null);
      jPanel1.add(getJButton(), null);

    }
    return jPanel1;
  }


  private JButton getJButton ( )
  {
    if (jButton == null)
    {
      jButton = new JButton ( );
      jButton.setText("swdfsdf");
      jButton.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
          System.exit(0);
        }
      });
    }
    return jButton;
  }


  private JDialog getJDialog ( )
  {
    if (jDialog == null)
    {
      jDialog = new JDialog ( );
      jDialog.setSize(400,300);
      jDialog.setContentPane(getJContentPane1());
      jDialog.setVisible(false);
      jDialog.setResizable(false);
//      jDialog.setUndecorated(true); //Titlebar weg, kein verschieben, sieht aber nicht gut aus


      jDialog.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter(){
        public void ancestorMoved(HierarchyEvent e)
        {
          cancelMouse(); // Deaktiviert die Mauseingabe
          if(old_point != null) {
            jDialog.setLocation(old_point);
          jDialog.validate();
          jDialog.repaint();
        }
        }
      });

    }
    return jDialog;
  }

  private JInternalFrame getJInternalFrame ( )
  {
    if (jInternalFrame == null)
    {
      jInternalFrame = new JInternalFrame ( );
      jInternalFrame.setTitle("Ein InternalFrame");
      jInternalFrame.setContentPane(getJContentPane2());
      jInternalFrame.setVisible(false);
      jInternalFrame.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter(){
        public void ancestorMoved(HierarchyEvent e)
        {
          cancelMouse2(); // Deaktiviert die Mauseingabe

          jInternalFrame.setLocation(old_point);
          jInternalFrame.validate();
          jInternalFrame.repaint();
          jInternalFrame.setVisible(true);

        }
      });
    }
    return jInternalFrame;
  }


  private void cancelMouse()
  {
    if(jDialog.isVisible()  ) //wird beim starten 1mal durchlaufen
    {
      try
      {
        Robot rb = new Robot();
        rb.mouseRelease(InputEvent.BUTTON1_MASK); //das man releasen kann
      }
      catch (Exception ex)
      {
        ex.printStackTrace(System.out);
      }
    }

  }

  private void cancelMouse2()
  {
    if(jInternalFrame.isVisible()  ) //wird beim starten 1mal durchlaufen
    {
      try
      {
        Robot rb2 = new Robot();
        rb2.mouseRelease(InputEvent.BUTTON1_MASK); //das man releasen kann
      }
      catch (Exception ex)
      {
        ex.printStackTrace(System.out);
      }
    }

  }




  private JPanel getJContentPane1 ( )
  {
    if (jContentPane1 == null)
    {
      jContentPane1 = new JPanel ( );
      jContentPane1.setLayout(new BorderLayout());
      jContentPane1.add(getJPanel2(), java.awt.BorderLayout.CENTER);

    }
    return jContentPane1;
  }


  private JPanel getJPanel2 ( )
  {
    if (jPanel2 == null)
    {
      jPanel2 = new JPanel ( );
      jPanel2.setLayout(new BorderLayout());
      jPanel2.add(getJPanel3(), java.awt.BorderLayout.NORTH);
      jPanel2.add(getJPanel4(), java.awt.BorderLayout.CENTER);
    }
    return jPanel2;
  }


  private JButton getJButton1 ( )
  {
    if (jButton1 == null)
    {
      jButton1 = new JButton ( );
      jButton1.setText("456");

    }
    return jButton1;
  }






  private JPanel getJPanel3 ( )
  {
    if (jPanel3 == null)
    {
//      File bild = new File("U:/titlebar_2.jpg");

//      JLabel jLabel = null;
//      try
//      {
//       jLabel = new JLabel(new ImageIcon(ImageIO.read(bild)));

        jPanel3 = new JPanel ( );
//        jPanel3.add(jLabel);
//      }
//      catch (IOException e)
//      {
//
//        e.printStackTrace();
//      }


    }

    return jPanel3;
  }



  private JPanel getJPanel4 ( )
  {
    if (jPanel4 == null)
    {
      jPanel4 = new JPanel ( );
      jPanel4.add(getJButton1(), null);
    }
    return jPanel4;
  }



  private JPanel getJPanel5 ( )
  {
    if (jPanel5 == null)
    {
      jPanel5 = new JPanel ( );
      jPanel5.setLayout(new BorderLayout());
      jPanel5.add(getJInternalFrame(), java.awt.BorderLayout.CENTER);
    }
    return jPanel5;
  }



  private JPanel getJContentPane2 ( )
  {
    if (jContentPane2 == null)
    {
      jContentPane2 = new JPanel ( );
      jContentPane2.setLayout(new BorderLayout());
      jContentPane2.add(getJPanel6(), java.awt.BorderLayout.SOUTH);
    }
    return jContentPane2;
  }



  private JPanel getJPanel6 ( )
  {
    if (jPanel6 == null)
    {
      jPanel6 = new JPanel ( );
      jPanel6.add(getJButton3(), null);
      jPanel6.add(getJButton4(), null);
    }
    return jPanel6;
  }



  private JButton getJButton3 ( )
  {
    if (jButton3 == null)
    {
      jButton3 = new JButton ( );
      jButton3.setText("Button");
    }
    return jButton3;
  }



  private JButton getJButton4 ( )
  {
    if (jButton4 == null)
    {
      jButton4 = new JButton ( );
      jButton4.setText("Nocheiner");
    }
    return jButton4;
  }

  public void createGlass(){

    glass.addMouseListener( new MouseAdapter(){});
    glass.setOpaque(false);
    jInternalFrame.setGlassPane(glass);
    glass.setVisible(true);

  }
  public static void main (String [ ] args)
  {

      Beispiel beispiel = new Beispiel();
      beispiel.getJFrame();
      beispiel.getJDialog();
      beispiel.createGlass();




  }
}
```


Damit sollte es ausführbar sein.
Wenn dus ausführst, dann siehts du links den InternalFrame, wo eigentlich ja ne GlassPane draufsein sollte (Zeile 391).
Bzw. wenn du in dem InternalFrame auf die Titlebar klickst, dann sind alle Buttons anklickbar. Ist schwierig zu beschrieben, muss ausprobieren.


----------



## Cole (10. Jul 2006)

@ Beni: Kannst du dirs nochmal kurz anschauen bitte?


----------



## Beni (10. Jul 2006)

Tschuldigung, hatte deine Antwort irgendwie übersehen.

Das ist ja lustig: das GlassPane verschwindet, wenn das Internalframe selektiert wird.

Das wird wohl irgendeine interne Optimierung sein ???:L 

Da würde ich versuchen, selbst eine Componente zu schreiben, welche ein GlassPane besitzt. In dem RootPane wird das GlassPane einfach mit "add( glass, 0 )" hinzugefügt, und seine Grösse gleich der Grösse des RootPanes gesetzt. Da könntest du wohl mal einiges kopieren gehen.


----------



## Cole (10. Jul 2006)

Beni hat gesagt.:
			
		

> Das ist ja lustig: das GlassPane verschwindet, wenn das Internalframe selektiert wird.


Ja, so sehe ich das auch. An dem Code stimmt ja alles oder? Da dürfte eigentlich kein Fehler sein.

Das mit der eigenen Komponente überzeugt mich nicht so ganz, weil das Project an sich (also die GUI) ja schon fast fertig ist und ich nicht nochmal alles neu machen will. Ist ein bisserl blöd.


----------



## Cole (11. Jul 2006)

Beni hat gesagt.:
			
		

> ...Aber nichts hindert dich daran, ein unsichtbares Panel einer anderen Component hinzuzuadden (GlassPanes werden nicht besonders behandelt). Nur sollte dieses unsichtbare Panel die anderen Elemente überlappen, und auch "zu oberst" sein.



hast du da ein Beispiel dafür?
Wie bekomm ich den ein Panel durchsichtig? Mit diesem setOpaque?


----------



## Beni (11. Jul 2006)

So, ist zwar nur schnell dahingeschmissen, aber funktioniert (Java 1.5). Die obere Klasse ist nur um das alles anzuzeigen, die untere "Glassed" ist das, was dich wohl interessieren wird.

*Notiz: obwohl die Maus abgeschaltet ist, funktioniert die Tastatur noch!*


```
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;

import javax.swing.*;


public class Test{
    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        
        JDesktopPane desktop = new JDesktopPane();
        frame.add( desktop );
        
        JInternalFrame normal = create( false );
        JInternalFrame stopped = create( true );
        
        desktop.add( normal );
        desktop.add( stopped );
        
        
        frame.setBounds( 20, 20, 500, 500 );
        normal.setBounds( 20, 20, 300, 300 );
        stopped.setBounds( 200, 200, 300, 300 );
        
        frame.validate();
        frame.setVisible( true );
    }
    
    private static JInternalFrame create( boolean stopInput ){
        JInternalFrame internal = new JInternalFrame();
        internal.setVisible( true );
        internal.setResizable( true );
        internal.setTitle( String.valueOf( stopInput ));
        
        Glassed glassed = new Glassed();
        internal.add( glassed );
        
        if( stopInput ){
            JPanel glass = new JPanel();
            glass.setBackground( Color.RED );
            glass.setOpaque( false );
            glass.addMouseListener( new MouseAdapter(){} );
            glassed.setGlass( glass );
        }
        
        JComponent content = glassed.getContent();
        content.setLayout( new GridLayout( 2, 2 ));
        content.add( new JButton( "1" ));
        content.add( new JButton( "2" ));
        content.add( new JButton( "3" ));
        content.add( new JButton( "4" ));
        
        return internal;
    }
}

class Glassed extends JLayeredPane{
    private JComponent glass;
    private JComponent content;
    
    public Glassed(){
        glass = new JPanel();
        glass.setOpaque( false );
        setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
        add( glass );
        
        content = new JPanel();
        setLayer( content, JLayeredPane.DEFAULT_LAYER.intValue() );
        add( content );
        
        invalidate();
    }
    
    public JComponent getContent() {
        return content;
    }
    
    public void setGlass( JComponent glass ) {
        remove( this.glass );
        
        this.glass = glass;
        setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
        add( glass );
        
        invalidate();
    }
    
    @Override
    public void doLayout() {
        content.setBounds( 0, 0, getWidth(), getHeight() );
        glass.setBounds( 0, 0, getWidth(), getHeight() );
    }
}
```


----------



## Cole (11. Jul 2006)

Danke dir. Werd das nachher mal durchgehen und durchdenken, dann werd ich meine aufkommenden Fragen posten.


----------



## Cole (12. Jul 2006)

Ich hab es mir gerade mal durchgelesen, aber ehrlich gesagt, hab ich es nicht wirklich verstanden 
Wenn ich dieses durchsichtige Panel auf ein Panel legen möchte, dass schon existiert, wie muss ich das dann machen?

Hier erst nochmal der Code vom gesamten Programm:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.HierarchyBoundsAdapter;
import java.awt.event.HierarchyEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JInternalFrame;


public class Beispiel
{

  JPanel glass = new JPanel();
  private Point old_point = new Point(00,00);
  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="4,6"
  private JPanel jContentPane = null;
  private JPanel jPanel = null;
  private JButton jButton2 = null;
  private JPanel jPanel1 = null;

  private JButton jButton = null;
  private JDialog jDialog = null;  //  @jve:decl-index=0:visual-constraint="380,385"
  private JPanel jContentPane1 = null;
  private JPanel jPanel2 = null;
  private JButton jButton1 = null;
  private JPanel jPanel3 = null;
  private JPanel jPanel4 = null;
  private JPanel jPanel5 = null;
  private JInternalFrame jInternalFrame = null;
  private JPanel jContentPane2 = null;
  private JPanel jPanel6 = null;
  private JButton jButton3 = null;
  private JButton jButton4 = null;
  private JFrame getJFrame ( )
  {
    if (jFrame == null)
    {
      jFrame = new JFrame ( );
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jFrame.setSize(new java.awt.Dimension(445,317));
      jFrame.setTitle("Hallo,Testbild");

      jFrame.setContentPane(getJContentPane());
      jFrame.setVisible(true);



    }
    return jFrame;
  }


  private JPanel getJContentPane ( )
  {
    if (jContentPane == null)
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.setRows(1);
      jContentPane = new JPanel ( );
      jContentPane.setLayout(gridLayout);
      jContentPane.add(getJPanel(), null);
      jContentPane.add(getJPanel5(), null);
    }
    return jContentPane;
  }


  private JPanel getJPanel ( )
  {
    if (jPanel == null)
    {

      jPanel = new JPanel ( );
      jPanel.setLayout(new BorderLayout());
      jPanel.add(getJPanel1(), java.awt.BorderLayout.SOUTH);

    }
    return jPanel;
  }


  private JButton getJButton2 ( )
  {
    if (jButton2 == null)
    {
      jButton2 = new JButton ( );

      jButton2.setText("sdfsd");
      jButton2.setPreferredSize(new java.awt.Dimension(80,50));
      jButton2.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
         jDialog.setVisible(true);
        }
      });

    }
    return jButton2;
  }


  private JButton getJButton ( )
  {
    if (jButton == null)
    {
      jButton = new JButton ( );
      jButton.setText("swdfsdf");
      jButton.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
          System.exit(0);
        }
      });
    }
    return jButton;
  }


  private JDialog getJDialog ( )
  {
    if (jDialog == null)
    {
      jDialog = new JDialog ( );
      jDialog.setSize(400,300);
      jDialog.setContentPane(getJContentPane1());
      jDialog.setVisible(false);
      jDialog.setResizable(false);

      jDialog.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter(){
        public void ancestorMoved(HierarchyEvent e)
        {
          cancelMouse(); // Deaktiviert die Mauseingabe
          if(old_point != null) {
            jDialog.setLocation(old_point);
          jDialog.validate();
          jDialog.repaint();
        }
        }
      });

    }
    return jDialog;
  }

  private JInternalFrame getJInternalFrame ( )
  {
    if (jInternalFrame == null)
    {
      jInternalFrame = new JInternalFrame ( );
      jInternalFrame.setTitle("Ein InternalFrame");
      jInternalFrame.setPreferredSize(new java.awt.Dimension(100,69));
      jInternalFrame.setContentPane(getJContentPane2());
      jInternalFrame.setVisible(false);

      jInternalFrame.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter(){
        public void ancestorMoved(HierarchyEvent e)
        {
          if(jInternalFrame.equals(e.getChanged())) {
          cancelMouse2(); // Deaktiviert die Mauseingabe
          jInternalFrame.setLocation(old_point);
          }
          jInternalFrame.validate();
          jInternalFrame.repaint();
          jInternalFrame.setVisible(true);

        }
      });
    }
    return jInternalFrame;
  }


  private void cancelMouse()
  {
    if(jDialog.isVisible()  ) //wird beim starten 1mal durchlaufen
    {
      try
      {
        Robot rb = new Robot();
        rb.mouseRelease(InputEvent.BUTTON1_MASK); //das man releasen kann
      }
      catch (Exception ex)
      {
        ex.printStackTrace(System.out);
      }
    }

  }

  private void cancelMouse2()
  {
    if(jInternalFrame.isVisible()  ) //wird beim starten 1mal durchlaufen
    {
      try
      {
        Robot rb2 = new Robot();
        rb2.mouseRelease(InputEvent.BUTTON1_MASK); //das man releasen kann
      }
      catch (Exception ex)
      {
        ex.printStackTrace(System.out);
      }
    }

  }




  private JPanel getJContentPane1 ( )
  {
    if (jContentPane1 == null)
    {
      jContentPane1 = new JPanel ( );
      jContentPane1.setLayout(new BorderLayout());
      jContentPane1.add(getJPanel2(), java.awt.BorderLayout.CENTER);

    }
    return jContentPane1;
  }


  private JPanel getJPanel2 ( )
  {
    if (jPanel2 == null)
    {
      jPanel2 = new JPanel ( );
      jPanel2.setLayout(new BorderLayout());
      jPanel2.add(getJPanel3(), java.awt.BorderLayout.NORTH);
      jPanel2.add(getJPanel4(), java.awt.BorderLayout.CENTER);
    }
    return jPanel2;
  }


  private JButton getJButton1 ( )
  {
    if (jButton1 == null)
    {
      jButton1 = new JButton ( );
      jButton1.setText("456");

    }
    return jButton1;
  }






  private JPanel getJPanel3 ( )
  {
    if (jPanel3 == null)
    {


        jPanel3 = new JPanel ( );



    }

    return jPanel3;
  }



  private JPanel getJPanel4 ( )
  {
    if (jPanel4 == null)
    {
      jPanel4 = new JPanel ( );
      jPanel4.add(getJButton1(), null);
    }
    return jPanel4;
  }



  private JPanel getJPanel5 ( )
  {
    if (jPanel5 == null)
    {
      jPanel5 = new JPanel ( );
      jPanel5.setLayout(new BorderLayout());
      jPanel5.add(getJInternalFrame(), java.awt.BorderLayout.CENTER);
    }
    return jPanel5;
  }



  private JPanel getJContentPane2 ( )
  {
    if (jContentPane2 == null)
    {
      jContentPane2 = new JPanel ( );
      jContentPane2.setLayout(new BorderLayout());
      jContentPane2.add(getJPanel6(), java.awt.BorderLayout.SOUTH);
    }
    return jContentPane2;
  }



  private JPanel getJPanel6 ( )
  {
    if (jPanel6 == null)
    {
      jPanel6 = new JPanel ( );
      jPanel6.add(getJButton3(), null);
      jPanel6.add(getJButton4(), null);
    }
    return jPanel6;
  }



  private JButton getJButton3 ( )
  {
    if (jButton3 == null)
    {
      jButton3 = new JButton ( );
      jButton3.setText("Button");
    }
    return jButton3;
  }



  private JButton getJButton4 ( )
  {
    if (jButton4 == null)
    {
      jButton4 = new JButton ( );
      jButton4.setText("Nocheiner");
    }
    return jButton4;
  }

//  public void createGlass(){
//
//    glass.addMouseListener( new MouseAdapter(){});
//    glass.setOpaque(false);
//    jInternalFrame.setGlassPane(glass);
//    glass.setVisible(true);

//  }
  private JPanel getJPanel1 ( )
  {
    if (jPanel1 == null)
    {
      jPanel1 = new JPanel ( );
      jPanel1.add(getJButton2(), null);
      jPanel1.add(getJButton(), null);

      }


    return jPanel1;
  }
  public static void main (String [ ] args)
  {

      Beispiel beispiel = new Beispiel();
      beispiel.getJFrame();
      beispiel.getJDialog();
   




  }

}
```

Ich hatte da folgendes versucht:
- Deine Klasse Glassed ganz unten hin, damit ich darauf einen Zugriff habe.
- in "private JPanel getJPanel1 ( )" das hier rein:

```
Glassed glassed = new Glassed();
      jPanel1.add( glassed );

      if( false ){
          JPanel glass = new JPanel();
          glass.setBackground( Color.RED );
          glass.setOpaque( false );
          glass.addMouseListener( new MouseAdapter(){} );
          glassed.setGlass( glass );
      }
```

Aber beim Auführen liegt über dem Panel (und damit über den 2 Buttons links) kein durchsichtiges Panel.
Da muss irgendwo ein Denkfehler von mir drin sein, weil nen Fehler von Eclipse bekomm ich nicht.


----------



## Beni (12. Jul 2006)

```
private JInternalFrame getJInternalFrame ( )
  {
    if (jInternalFrame == null)
    {
      jInternalFrame = new JInternalFrame ( );
      jInternalFrame.setTitle("Ein InternalFrame");
      jInternalFrame.setPreferredSize(new java.awt.Dimension(100,69));
      
      Glassed glassed = new Glassed();
      glassed.getContent().setLayout( new GridLayout( 1, 1 ));
      glassed.getContent().add( getJContentPane2() );
      
      JPanel glass = new JPanel();
      glass.setOpaque( false );
      glass.addMouseListener( new MouseAdapter(){} );
      glassed.setGlass( glass ); 
      
// Das Glassed muss zuunterst liegen, damit sein glass alles andere überdecken kann
      jInternalFrame.setContentPane( glassed );
      jInternalFrame.setVisible(false);

      jInternalFrame.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter(){
        @Override
        public void ancestorMoved(HierarchyEvent e)
        {
          if(jInternalFrame.equals(e.getChanged())) {
          cancelMouse2(); // Deaktiviert die Mauseingabe
          jInternalFrame.setLocation(old_point);
          }
          jInternalFrame.validate();
          jInternalFrame.repaint();
          jInternalFrame.setVisible(true);

        }
      });
    }
    return jInternalFrame;
  }
```


----------



## Cole (12. Jul 2006)

hmm, so liegt das durchsichtige Panel ja auf dem JInternalFrame auf der rechten Seite.
Wie muss ich es aber machen, dass das durchsichtige Panel auf das Panel *auf der linken Seite* (mit den Buttons "sdfsd" und "swdfsdf") liegt? 
Also nur auf diesem einen Panel, damit ich zB drüber noch ein anderes Panel legen könnte, bei dem Buttons bedienbar wären?

Also, nur auf einem Panel soll das durchsichteige Panel sein (= nicht klickbar) und ein anderes,das noch zu erstellen wäre, soll ganz "normal" sein.


----------



## Cole (13. Jul 2006)

Kann mir da niemand weiterhelfen?
Sorry, bin ein wenig ungeduldig, will jetzt endlich, dass der Mist funktioniert.


----------



## Beni (13. Jul 2006)

Anstelle eines normalen Panels verwendest du das Glassed. Dann fügst du dein Zeugs dem "glassed.getContent"-Panel hinzu. Du ersetzt noch das GlassPane "glassed.setGlass" mit einem Panel das einen MouseListener hat, und das wars eigentlich. 

Schau dir den Code für das Internal-Frame an, oben. Mehr kann ich dazu eigentlich nicht sagen...


----------



## Cole (14. Jul 2006)

Also, ich hab das gerade mal probiert, aber ich schnalls nicht wirklich 
hier mal der code (hab aus dem oben paar Sachen rausgenommen, die für dieses Problem nicht wichtig sind)


```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;



public class Beispiel
{

  JPanel glass = new JPanel();
  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="4,6"
  private JPanel jContentPane = null;
  private JPanel jPanel = null;
  private JButton jButton2 = null;
  private JPanel jPanel1 = null;
  private JButton jButton = null;
  private JButton jButton3 = null;
  private JButton jButton4 = null;
  private Glassed glassed = null;
  private JPanel panelMitML = new JPanel();
  private JPanel jPanel3 = null;
  private JFrame getJFrame ( )

  {
    if (jFrame == null)
    {
      jFrame = new JFrame ( );
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jFrame.setSize(new java.awt.Dimension(445,317));
      jFrame.setTitle("Hallo,Testbild");

      jFrame.setContentPane(getJContentPane());
      jFrame.setVisible(true);



    }
    return jFrame;
  }


  private JPanel getJContentPane ( )
  {
    if (jContentPane == null)
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.setRows(1);
      jContentPane = new JPanel ( );
      jContentPane.setLayout(gridLayout);
      jContentPane.add(getJPanel(), null);
    }
    return jContentPane;
  }


  private JPanel getJPanel ( )
  {
    if (jPanel == null)
    {

      jPanel = new JPanel ( );
      jPanel.setLayout(new BorderLayout());
      jPanel.add(getJPanel3(), java.awt.BorderLayout.WEST);
    }
    return jPanel;
  }


  private JButton getJButton2 ( )
  {
    if (jButton2 == null)
    {
      jButton2 = new JButton ( );

      jButton2.setText("Irgendwas");
      jButton2.setPreferredSize(new java.awt.Dimension(80,50));
      jButton2.setToolTipText("Hallo, ich bin ein Button");

    }
    return jButton2;
  }


  private JButton getJButton ( )
  {
    if (jButton == null)
    {
      jButton = new JButton ( );
      jButton.setText("Ende");
      jButton.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
          System.exit(0);
        }
      });
    }
    return jButton;
  }


  private JButton getJButton3 ( )
  {
    if (jButton3 == null)
    {
      jButton3 = new JButton ( );
      jButton3.setText("Button");
    }
    return jButton3;
  }



  private JButton getJButton4 ( )
  {
    if (jButton4 == null)
    {
      jButton4 = new JButton ( );
      jButton4.setText("Nocheiner");
    }
    return jButton4;
  }


  private JPanel getJPanel1 ( )
  {
    if (jPanel1 == null)
    {
      jPanel1 = new JPanel ( );
      jPanel1.add(getJButton2(), null);
      jPanel1.add(getJButton(), null);
      jPanel1.setToolTipText("Ich bin ein Panel");
      }


    return jPanel1;
  }
  /**
   * This method initializes jPanel2
   *
   * @return javax.swing.JPanel
   *
   */


  private Glassed getGlassed ( )
  {

      glassed = new Glassed ( );
      glassed.getContent();
      glassed.add(getJButton3(), null);
      glassed.add(getJButton4(), null);
      panelMitML.addMouseListener(new MouseListener(){

        public void mouseClicked (MouseEvent arg0)
        {
          // TODO Automatisch erstellter Methoden-Stub

        }

        public void mousePressed (MouseEvent arg0)
        {
          // TODO Automatisch erstellter Methoden-Stub

        }

        public void mouseReleased (MouseEvent arg0)
        {
          // TODO Automatisch erstellter Methoden-Stub

        }

        public void mouseEntered (MouseEvent arg0)
        {
          // TODO Automatisch erstellter Methoden-Stub

        }

        public void mouseExited (MouseEvent arg0)
        {
          // TODO Automatisch erstellter Methoden-Stub

        }});

      glassed.setGlass(panelMitML);

    return glassed;
  }


  /**
   * This method initializes jPanel3
   *
   * @return javax.swing.JPanel
   */
  private JPanel getJPanel3 ( )
  {
    if (jPanel3 == null)
    {
      jPanel3 = new JPanel ( );
      jPanel3.setLayout(new BorderLayout());
      jPanel3.add(getGlassed(), java.awt.BorderLayout.NORTH);
      jPanel3.add(getJPanel1(), java.awt.BorderLayout.SOUTH);
    }
    return jPanel3;
  }


  public static void main (String [ ] args)
  {

      Beispiel beispiel = new Beispiel();
      beispiel.getJFrame();






  }

}

class Glassed extends JLayeredPane{
  private JComponent glass;
  private JComponent content;

  public Glassed(){
      glass = new JPanel();
      glass.setOpaque( false );
      setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
      add( glass );

      content = new JPanel();
      setLayer( content, JLayeredPane.DEFAULT_LAYER.intValue() );
      add( content );

      invalidate();
  }

  public JComponent getContent() {
      return content;
  }

  public void setGlass( JComponent glass ) {
      remove( this.glass );

      this.glass = glass;
      setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
      add( glass );

      invalidate();
  }

  @Override
  public void doLayout() {
      content.setBounds( 0, 0, getWidth(), getHeight() );
      glass.setBounds( 0, 0, getWidth(), getHeight() );
  }
}
```

Aber jetzt hab ich das Problem, dass das Panel in dem die 2 Buttons "Button" und "Nocheiner" liegen (das eigentlich links oben sein sollte) komplett verschwunden ist.
Wo liegt denn mein Fehler?[/quote]

[Edit]: Ich habe gerade nochmal ein wenig rumprobiert, und glaube dass ich jtzt schon näher am Ergebnis bin als bei obigem Code. Jetzt bleuiben wenigestens alles Panels wo sie hingehören. Nur klicken kann ich immer noch alles.
Das Glass soll hier auf das Panel3 was dem Panel links oben entspricht.



```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import java.awt.FlowLayout;



public class Beispiel
{

  JPanel glass = new JPanel();
  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="102,65"
  private JPanel jContentPane = null;
  private JPanel jPanel = null;
  private JButton jButton2 = null;
  private JPanel jPanel1 = null;
  private JButton jButton = null;
  private JButton jButton3 = null;
  private JButton jButton4 = null;
  private JPanel jPanel3 = null;
  private JPanel jPanel2 = null;
  private JFrame getJFrame ( )

  {
    if (jFrame == null)
    {
      jFrame = new JFrame ( );
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jFrame.setSize(new java.awt.Dimension(445,317));
      jFrame.setTitle("Hallo,Testbild");

      jFrame.setContentPane(getJContentPane());
      jFrame.setVisible(true);



    }
    return jFrame;
  }


  private JPanel getJContentPane ( )
  {
    if (jContentPane == null)
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.setRows(1);
      jContentPane = new JPanel ( );
      jContentPane.setLayout(gridLayout);
      jContentPane.add(getJPanel(), null);
    }
    return jContentPane;
  }


  private JPanel getJPanel ( )
  {
    if (jPanel == null)
    {

      jPanel = new JPanel ( );
      jPanel.setLayout(new BorderLayout());
      jPanel.add(getJPanel2(), java.awt.BorderLayout.WEST);
    }
    return jPanel;
  }


  private JButton getJButton2 ( )
  {
    if (jButton2 == null)
    {
      jButton2 = new JButton ( );

      jButton2.setText("Irgendwas");
      jButton2.setPreferredSize(new java.awt.Dimension(80,50));
      jButton2.setToolTipText("Hallo, ich bin ein Button");

    }
    return jButton2;
  }


  private JButton getJButton ( )
  {
    if (jButton == null)
    {
      jButton = new JButton ( );
      jButton.setText("Ende");
      jButton.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
          System.exit(0);
        }
      });
    }
    return jButton;
  }


  private JButton getJButton3 ( )
  {
    if (jButton3 == null)
    {
      jButton3 = new JButton ( );
      jButton3.setText("Button");
    }
    return jButton3;
  }



  private JButton getJButton4 ( )
  {
    if (jButton4 == null)
    {
      jButton4 = new JButton ( );
      jButton4.setText("Nocheiner");
    }
    return jButton4;
  }


  private JPanel getJPanel1 ( )
  {
    if (jPanel1 == null)
    {
      jPanel1 = new JPanel ( );
      jPanel1.setLayout(new FlowLayout());
      jPanel1.setToolTipText("Ich bin ein Panel");
      jPanel1.add(getJButton2(), null);
      jPanel1.add(getJButton(), null);
      }


    return jPanel1;
  }
  /**
   * This method initializes jPanel3
   *
   * @return javax.swing.JPanel
   */
  private JPanel getJPanel3 ( )
  {
    if (jPanel3 == null)
    {
      jPanel3 = new JPanel ( );
      jPanel3.setLayout(new FlowLayout());

      Glassed glassed = new Glassed();
      glassed.getContent().setLayout( new GridLayout( 1, 1 ));
      glassed.getContent().add( getJContentPane() );

      JPanel glass = new JPanel();
      glass.setOpaque( false );
      glass.addMouseListener( new MouseAdapter(){} );
      glassed.setGlass( glass );

      jPanel3.add(getJButton3(), null);
      jPanel3.add(getJButton4(), null);
      jPanel3.add(glass);
    }
    return jPanel3;
  }


  /**
   * This method initializes jPanel2
   *
   * @return javax.swing.JPanel
   */
  private JPanel getJPanel2 ( )
  {
    if (jPanel2 == null)
    {
      jPanel2 = new JPanel ( );
      jPanel2.setLayout(new BorderLayout());
      jPanel2.add(getJPanel1(), java.awt.BorderLayout.SOUTH);
      jPanel2.add(getJPanel3(), java.awt.BorderLayout.NORTH);
    }
    return jPanel2;
  }


  public static void main (String [ ] args)
  {

      Beispiel beispiel = new Beispiel();
      beispiel.getJFrame();






  }

}

class Glassed extends JLayeredPane{
  private JComponent glass;
  private JComponent content;

  public Glassed(){
      glass = new JPanel();
      glass.setOpaque( false );
      setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
      add( glass );

      content = new JPanel();
      setLayer( content, JLayeredPane.DEFAULT_LAYER.intValue() );
      add( content );

      invalidate();
  }

  public JComponent getContent() {
      return content;
  }

  public void setGlass( JComponent glass ) {
      remove( this.glass );

      this.glass = glass;
      setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
      add( glass );

      invalidate();
  }

  @Override
  public void doLayout() {
      content.setBounds( 0, 0, getWidth(), getHeight() );
      glass.setBounds( 0, 0, getWidth(), getHeight() );
  }
}
```


----------



## Beni (14. Jul 2006)

Zum einen wars ein Problem mit der Grösse der Componente (Glassed muss noch ein paar zusätzliche Methoden haben), zum anderen hast du nicht verstanden, dass das Glassed *zwischen* deinem Frame und den Buttons liegen muss. Es reicht nicht, es einfach mal herzustellen, und dann wieder wegzuwerfen.

Habe die "getJPanel3()"-Methode entsprechend abgeändert.

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;

import javax.swing.*;



public class Beispiel
{

  JPanel glass = new JPanel();
  private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="102,65"
  private JPanel jContentPane = null;
  private JPanel jPanel = null;
  private JButton jButton2 = null;
  private JPanel jPanel1 = null;
  private JButton jButton = null;
  private JButton jButton3 = null;
  private JButton jButton4 = null;
  private JComponent jPanel3 = null;
  private JPanel jPanel2 = null;
  private JFrame getJFrame ( )

  {
    if (jFrame == null)
    {
      jFrame = new JFrame ( );
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jFrame.setSize(new java.awt.Dimension(445,317));
      jFrame.setTitle("Hallo,Testbild");

      jFrame.setContentPane(getJContentPane());
      jFrame.setVisible(true);



    }
    return jFrame;
  }


  private JPanel getJContentPane ( )
  {
    if (jContentPane == null)
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.setRows(1);
      jContentPane = new JPanel ( );
      jContentPane.setLayout(gridLayout);
      jContentPane.add(getJPanel(), null);
    }
    return jContentPane;
  }


  private JPanel getJPanel ( )
  {
    if (jPanel == null)
    {

      jPanel = new JPanel ( );
      jPanel.setLayout(new BorderLayout());
      jPanel.add(getJPanel2(), java.awt.BorderLayout.WEST);
    }
    return jPanel;
  }


  private JButton getJButton2 ( )
  {
    if (jButton2 == null)
    {
      jButton2 = new JButton ( );

      jButton2.setText("Irgendwas");
      jButton2.setPreferredSize(new java.awt.Dimension(80,50));
      jButton2.setToolTipText("Hallo, ich bin ein Button");

    }
    return jButton2;
  }


  private JButton getJButton ( )
  {
    if (jButton == null)
    {
      jButton = new JButton ( );
      jButton.setText("Ende");
      jButton.addActionListener (new java.awt.event.ActionListener ( )
      {
        public void actionPerformed (java.awt.event.ActionEvent e)
        {
          System.exit(0);
        }
      });
    }
    return jButton;
  }


  private JButton getJButton3 ( )
  {
    if (jButton3 == null)
    {
      jButton3 = new JButton ( );
      jButton3.setText("Button");
    }
    return jButton3;
  }



  private JButton getJButton4 ( )
  {
    if (jButton4 == null)
    {
      jButton4 = new JButton ( );
      jButton4.setText("Nocheiner");
    }
    return jButton4;
  }


  private JPanel getJPanel1 ( )
  {
    if (jPanel1 == null)
    {
      jPanel1 = new JPanel ( );
      jPanel1.setLayout(new FlowLayout());
      jPanel1.setToolTipText("Ich bin ein Panel");
      jPanel1.add(getJButton2(), null);
      jPanel1.add(getJButton(), null);
      }


    return jPanel1;
  }
  /**
   * This method initializes jPanel3
   *
   * @return javax.swing.JPanel
   */
  private JComponent getJPanel3 ( )
  {
    if (jPanel3 == null)
    {
        jPanel3 = new JPanel ( );
        jPanel3.setLayout(new FlowLayout());

        Glassed glassed = new Glassed();
        glassed.getContent().setLayout( new GridLayout( 1, 1 ));
        //glassed.getContent().add( getJContentPane() );

        JPanel glass = new JPanel();
        glass.setOpaque( false );
        glass.addMouseListener( new MouseAdapter(){} );
        glassed.setGlass( glass );

        jPanel3.add(getJButton3(), null);
        jPanel3.add(getJButton4(), null);
        //jPanel3.add(glass); 
        
        glassed.getContent().add( jPanel3 );
        jPanel3 = glassed;
    }
    return jPanel3;
  }


  /**
   * This method initializes jPanel2
   *
   * @return javax.swing.JPanel
   */
  private JPanel getJPanel2 ( )
  {
    if (jPanel2 == null)
    {
      jPanel2 = new JPanel ( );
      jPanel2.setLayout(new BorderLayout());
      jPanel2.add(getJPanel1(), java.awt.BorderLayout.SOUTH);
      jPanel2.add(getJPanel3(), java.awt.BorderLayout.NORTH);
    }
    return jPanel2;
  }


  public static void main (String [ ] args)
  {

      Beispiel beispiel = new Beispiel();
      beispiel.getJFrame();






  }

}

class Glassed extends JLayeredPane{
    private JComponent glass;
    private JComponent content;

    public Glassed(){
        glass = new JPanel();
        glass.setOpaque( false );
        setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
        add( glass );

        content = new JPanel();
        setLayer( content, JLayeredPane.DEFAULT_LAYER.intValue() );
        add( content );

        invalidate();
    }

    public JComponent getContent() {
        return content;
    }

    public void setGlass( JComponent glass ) {
        remove( this.glass );

        this.glass = glass;
        setLayer( glass, JLayeredPane.MODAL_LAYER.intValue() );
        add( glass );

        invalidate();
    }

    @Override
    public Dimension getPreferredSize() {
        return content.getPreferredSize();
    }
    
    @Override
    public Dimension getMinimumSize() {
        return content.getMinimumSize();
    }
    
    @Override
    public Dimension getMaximumSize() {
        return content.getMaximumSize();
    }

    @Override
    public void doLayout() {
        content.setBounds( 0, 0, getWidth(), getHeight() );
        glass.setBounds( 0, 0, getWidth(), getHeight() );
    }
}
```


----------



## Cole (14. Jul 2006)

Super, danke dir. Habs grad mal ausprobiert und es geht so wie es will.
Werds jetzt dann erstmal durch gehen und versuchen ein weng was von zu verstehen!
Aufkommen Fragen werden wieder gepostet


----------



## Cole (17. Jul 2006)

@ Beni:
Seh ich es richtig, dass das nur richtig funktioniert, wenn man das hier 



```
Glassed glassed = new Glassed();
      glassed.getContent().setLayout(new GridLayout(1,1));
      JPanel glass = new JPanel();
      glass.setOpaque(false);
      glass.addMouseListener(new MouseAdapter(){});
      glassed.setGlass(glass);
      glassed.getContent().add(jPanel38);
      jPanel38 = glassed;
```

direkt in den diese Methode einfügt?


```
private JComponent getJPanel3 ( )
```

Habs nämlich grad mal versucht es in einem actionlistener von einem anderen Button zu machen, aber sobald ich dann im laufenden Programm auf den Button klicke, verschwindet das Panel ganz.

Bei Bedarf werd ich noch einen kleinen Beispiel Code posten (morgen), nur grad hab ich nicht genug Zeit.


----------



## Beni (17. Jul 2006)

Das sollte überall funktionieren, du musst nur darauf achten, dass die Componenten auch an der richtigen Stelle hinzugefügt werden. Ein "setBackground( Color.RED )" hilft oft um zu sehen, bis wohin die Componenten noch richtig zusammengebaut sind.


----------



## Cole (18. Jul 2006)

ok, werd ich dann mal ein wenig mitrumspielen.
Aber mir ist da was aufgefallen:
Sobald ich diese durchsichtigen Panels eingefügt habe und die Klasse mit dem Visualeditor aufmachen will bekomm ich diesen Fehler hier:

Bei dem Versuch, die neue Datei im Editor festzulegen, ist ein Fehler aufgetreten.
Ursache:
org.eclipse.ve.internal.jfc.core.ContainerProxyAdapter


Was soll denn das bedeuten?


----------



## Beni (18. Jul 2006)

Das der Visualeditor nicht so dolle ist  (schick den Autoren eine Mail und den Code, wie du die Exception erzeugst - die haben bestimmt Freude daran)


----------



## Cole (18. Jul 2006)

Den Eindruck hab ich so langsam auch. 
Das mit dem Bugreport werd ich mal in Erwägung ziehen, vielleicht bringts ja was!


----------

