# Glasspane Demo von Sun hat Probleme - wie fix ich die?



## Jezzy (22. Jul 2008)

Hier ist die Glasspane Demo: http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html

Das wichtige ist in dieser Demo dass MouseEvents weitergeleitet werden. Das Problem damit ist, dass wenn ich bei aktiver GlassPane die Maus ueber der JCheckbox druecke und dann gedrueckt halte und mich aus der JCheckbox rausbewege, dann bleibt das Ding in der "gedrueckt" Position verharren. 

Schlimmer waere es wenn ich das bei einem JSpinner mache - dann bleibt der Knopf des Spinners naemlich in der Gedrueckt-Position verharren und incrementiert dessen Wert ewig weiter.

Tested es hier: http://java.sun.com/docs/books/tutorialJWS/uiswing/components/ex6/GlassPaneDemo.jnlp


Weiss wie ich dieses Problem bei der ansonsten sehr guten Mausweiterleitung abstellen kann?


Danke...jez


----------



## Beni (22. Jul 2008)

Falls du die Maus nicht im Glass-Pane abfangen willst: überschreibe "contains( int x, int y )" und gib immer "false" zurück. "setOpaque" solltest du dann auch noch mit "false" aufrufen.

Das könnte so aussehen:

```
private class Overlay extends JPanel{
        public Overlay(){
            setOpaque( false );
        }
        
        @Override
        public boolean contains( int x, int y ) {
            return false;
        }
        
        @Override
        protected void paintComponent( Graphics g ) {
            paintOverlay( g );
        }
```

Falls du die Maus abfangen und selbstständig weiterleiten willst, da kenne ich nur komplizierte Lösungen. z.B. diese (aus einem meiner Projekte geklaut):

```
package bibliothek.gui.dock.security;



import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.*;

import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


/**
 * A panel containing two children: a "content pane" and a "glass pane". The
 * "content pane" can be replaced by the client and can be any {@link JComponent}.
 * The "glassed pane" is an invisible panel above the "content pane". It will
 * catch all {@link MouseEvent}s, inform a {@link SecureMouseFocusObserver} about
 * them, and then forward the events to the "content pane".
 * [b]Note:[/b] clients can use {@link SecureDockController#wrap(JComponent)} to
 * create and register a {@link GlassedPane} in one step.

 * @author Benjamin Sigg

 */

public class GlassedPane extends JPanel{

    /** An arbitrary component */

    private JComponent contentPane = new JPanel();

    /** A component lying over all other components. Catches every MouseEvent */

    private JComponent glassPane = new GlassPane();

    /** A controller which will be informed about every click of the mouse */

    private SecureMouseFocusObserver focusController;

    

    /**

     * Creates a new pane

     */

    public GlassedPane(){

        setLayout( null );

        add( glassPane );

        add( contentPane );

        setFocusCycleRoot( true );

    }

    
    /**
     * Creates a new pane and registers <code>this</code> at <code>observer</code>.
     * @param observer the observer <code>this</code> has to be registered at
     */
    public GlassedPane( SecureMouseFocusObserver observer ){
    	this();
    	observer.addGlassPane( this );
    }
    

    /**

     * Sets the focus-observer which has to be informed when the mouse is clicked

     * or the mouse wheel is moved.

     * @param focusController the controller, may be <code>null</code>

     */

    public void setFocusController( SecureMouseFocusObserver focusController ) {

        this.focusController = focusController;

    }



    @Override

    public void doLayout() {

        int width = getWidth();

        int height = getHeight();

        contentPane.setBounds( 0, 0, width, height );

        glassPane.setBounds( 0, 0, width, height );

    }



    @Override

    public Dimension getPreferredSize() {

        return contentPane.getPreferredSize();

    }

    @Override

    public Dimension getMaximumSize() {

        return contentPane.getMinimumSize();

    }

    @Override

    public Dimension getMinimumSize() {

        return contentPane.getMinimumSize();

    }



    /**

     * Sets the center panel of this GlassedPane.

     * @param contentPane the content of this pane, not <code>null</code>

     */

    public void setContentPane( JComponent contentPane ) {

        if( contentPane == null )

            throw new IllegalArgumentException( "Content Pane must not be null" );

        this.contentPane = contentPane;



        removeAll();



        add( glassPane );

        add( contentPane );

    }



    /**

     * Gets the content of this pane.

     * @return the content

     */

    public JComponent getContentPane(){

        return contentPane;

    }



    /**

     * Gets the transparent panel that is lying over the ContentPane.

     * @return the GlassPane

     */

    public JComponent getGlassPane(){

        return glassPane;

    }

    

    /**

     * A panel that lies over all other components of the enclosing GlassedPane.

     * This panel catches all MouseEvent, and informs the {@link GlassedPane#focusController focusController}

     * about the events.

     * @author Benjamin Sigg

     */

    private class GlassPane extends JPanel implements MouseListener, MouseMotionListener, MouseWheelListener{

        /** the component where a drag-event started */

        private Component dragged;

        /** the component currently under the mouse */

        private Component over;

        /** the number of pressed buttons */

        private int downCount = 0;



        /**

         * Creates a new GlassPane.

         */

        public GlassPane(){

            addMouseListener( this );

            addMouseMotionListener( this );

            addMouseWheelListener( this );



            setOpaque( false );

        }



        public void mouseClicked( MouseEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        public void mousePressed( MouseEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        public void mouseReleased( MouseEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        public void mouseEntered( MouseEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        public void mouseExited( MouseEvent e ) {

            if( !e.isConsumed() && isVisible() )

                send( e );



            if( !isVisible() ){

                downCount = 0;

            }

        }



        public void mouseDragged( MouseEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        public void mouseMoved( MouseEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        public void mouseWheelMoved( MouseWheelEvent e ) {

            if( !e.isConsumed() )

                send( e );

        }



        /**

         * Shorthand for <code>send( e, e.getID() );</code>.

         * @param e the event to send

         */

        private void send( MouseEvent e ){

            send( e, e.getID() );

        }



        /**

         * Dispatches the event <code>e</code> to the ContentPane or a child

         * of the ContentPane. Also informs the FocusManager about the event.

         * @param e the event to handle

         * @param id the type of the event

         */

        private void send( MouseEvent e, int id ){

            Point mouse = e.getPoint();

            Component component = SwingUtilities.getDeepestComponentAt( contentPane, mouse.x, mouse.y );



            boolean drag = id == MouseEvent.MOUSE_DRAGGED;

            boolean press = id == MouseEvent.MOUSE_PRESSED;

            boolean release = id == MouseEvent.MOUSE_RELEASED;

            boolean moved = id == MouseEvent.MOUSE_MOVED;

            boolean entered = id == MouseEvent.MOUSE_ENTERED;

            boolean exited = id == MouseEvent.MOUSE_EXITED;



            if( drag && dragged == null )

                dragged = component;

            else if( drag )

                component = dragged;



            if( press )

                downCount++;



            if( downCount > 0 && dragged != null )

                component = dragged;

            else if( downCount > 0 && dragged == null )

                dragged = component;

            else if( downCount == 0 )

                dragged = null;



            if( release ){

                downCount--;

                if( downCount < 0 )

                    downCount = 0;

            }



            if( moved || entered || exited ){

                if( over != component ){

                    if( over != null ){

                        over.dispatchEvent( new MouseEvent( 

                                over, MouseEvent.MOUSE_EXITED, e.getWhen(), e.getModifiers(), 

                                mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(), 

                                e.getButton() ));

                    }



                    over = component;



                    if( over != null ){

                        over.dispatchEvent( new MouseEvent( 

                                over, MouseEvent.MOUSE_ENTERED, e.getWhen(), e.getModifiers(), 

                                mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(), 

                                e.getButton() ));

                    }

                }

            }

            

            if( component == null ){

                setCursor( null );

                setToolTipText( null );

            }

            else{

                mouse = SwingUtilities.convertPoint( this, mouse, component );

                MouseEvent forward = new MouseEvent( 

                        component, id, e.getWhen(), e.getModifiers(), 

                        mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(), 

                        e.getButton() );

                

                if( focusController != null )

                    focusController.check( forward );

                

                component.dispatchEvent( forward );

                

                Cursor cursor = component.getCursor();

                if( getCursor() != cursor )

                    setCursor( cursor );



                if( component instanceof JComponent ){

                    JComponent jcomp = (JComponent)component;

                    String tooltip = jcomp.getToolTipText( forward );

                    String thistip = getToolTipText();



                    if( tooltip != thistip ){

                        if( tooltip == null || thistip == null || !tooltip.equals( thistip ))

                            setToolTipText( tooltip );

                    }

                }

                else

                    setToolTipText( null );

            }

        }



        /**

         * Dispatches the event <code>e</code> to the ContentPane or one

         * of the children of ContentPane. Also informs the focusController about

         * the event.

         * @param e the event to dispatch

         */

        private void send( MouseWheelEvent e ){

            Point mouse = e.getPoint();

            Component component = SwingUtilities.getDeepestComponentAt( contentPane, mouse.x, mouse.y );

            if( component != null ){

                mouse = SwingUtilities.convertPoint( this, mouse, component );

                MouseWheelEvent forward = new MouseWheelEvent( 

                        component, e.getID(), e.getWhen(), e.getModifiers(), 

                        mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(), 

                        e.getScrollType(), e.getScrollAmount(), e.getWheelRotation() );

                

                if( focusController != null )

                    focusController.check( forward );

                

                component.dispatchEvent( forward );

            }

        }

    }

}
```


----------



## Jezzy (22. Jul 2008)

Ich will schon dass die MouseEvents weitergereicht werden. Ich will nur das der Bug verschwindet den ich oben beschrieben hab.


----------



## Beni (22. Jul 2008)

Die Maus erreicht die darunterliegenden Componenten in beiden Codes. Der Unterschied ist lediglich ob ein MouseListener der Glass-Pane hinzugefügt werden könnte. Im ersten Code würde der nie anspringen, im zweiten schon.


----------



## Guest (22. Jul 2008)

Beni hat gesagt.:
			
		

> Die Maus erreicht die darunterliegenden Componenten in beiden Codes. Der Unterschied ist lediglich ob ein MouseListener der Glass-Pane hinzugefügt werden könnte. Im ersten Code würde der nie anspringen, im zweiten schon.



Danke. Ich verstehe aber immer noch nicht wie es genau funktioniert oder wo genau der Unterschied ist - kannst du nicht kurz umschreiben was es anderst macht. Die Aussage von oben ist irgendwie auch nach mehrmaligem Lesen sehr unklar.

Leider kann ich den Code auch nicht testen da einige Abhaengigkeiten fehlen. Wie koennte ich denn das Sun Glasspane Beispiel leicht modifizieren damit der Bug nicht auftritt?

Btw, beim Codelesen habe ich:

    @Override

    public Dimension getMaximumSize() {

        return contentPane.getMinimumSize();

    } 

ist es Absicht Minsize zurueckzugeben?



Auch habe ich mir dein Dockingframework angeschaut - neat! Das einzige was mich stoert und ein leicht kindisches Bild verleiht sind die Icons - nehm doch die Eclipse Icons, damit wuerde es richtig professionell aussehen. Von den Funktionen und der Performance ist es wirklich sehr professionell.


----------



## Beni (22. Jul 2008)

> Danke. Ich verstehe aber immer noch nicht wie es genau funktioniert oder wo genau der Unterschied ist - kannst du nicht kurz umschreiben was es anderst macht. Die Aussage von oben ist irgendwie auch nach mehrmaligem Lesen sehr unklar.


Ok, ich versuche es.

Die erste Version überschreibt die Methode "contains" und gibt immer "false" zurück. Wenn das System ein MouseEvent verschicken will, und rausfinden will, wohin das Event kommt, dann wird es diese erste Version nie beachten. Denn das System findet den Ursprung des MouseEvents indem es "contains" bei verschiedenen Componenten aufruft.
-> Bei der ersten Version fällt das MouesEvent "durch" die Component

Die zweite Version fängt alle MouseEvents ab. Dann sucht es selber die Component zu welcher das Event gehört und generiert ein neues Event welches es weiterschickt. Der Benutzer interagiert sozusagen nie mit den "verdeckten" Componenten sondern immer nur mit dem Glass-Pane, welches dann in einem zweiten Schritt mit den verdeckten Componenten interagiert.
-> Bei der zweiten Version wird das MouseEvent abgefangen und durch ein neues ersetzt.

Die Abhängigkeiten kannst du einfach rauslöschen, Ich habe das mal gemacht und auch ein kleines Beispiel-Programm geschrieben das ungefähr dasselbe macht wie das Sun-Beispiel.
Das ist aber höchstens ein Startpunkt, für deine eigenen Anwendungen müsstest du das noch umschreiben (kannst dabei wahrscheinlich die Hälfte des Codes weglöschen...)

P.S. ja, das mit dem maximize-minimize ist falsch, danke fürs erkennen :wink:

```
package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GlassTest extends JPanel {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		GlassedPane pane = new GlassedPane();
		JPanel boxes = new JPanel( new GridLayout( 2, 1 ));
		boxes.add( new JCheckBox( "aAaAa" ));
		boxes.add( new JCheckBox( "bBbBb" ));
		pane.setContentPane( boxes );
		
		final GlassTest test = new GlassTest();
	 	JComponent glass = pane.getGlassPane();
	 	glass.setLayout( new GridLayout( 1, 1 ));
	 	glass.add( test );
		glass.addMouseListener( new MouseAdapter(){
			@Override
			public void mousePressed(MouseEvent e) {
				test.select( e.getX(), e.getY() );
			}
		});
	 	
		frame.add( pane );
		frame.pack();
		frame.setVisible( true );
	}
	
	private int x;
	private int y;
	
	public GlassTest(){
		setOpaque( false );
	}
	
	public void select( int x, int y ){
		this.x = x;
		this.y = y;
		repaint();
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		g.setColor( Color.RED );
		g.fillOval( x - 2, y - 2, 5, 5 );
	}
	
	@Override
	public boolean contains(int x, int y) {
		return false;
	}
}
```


```
package test;

import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JComponent;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


/**
* A panel containing two children: a "content pane" and a "glass pane". The
* "content pane" can be replaced by the client and can be any {@link JComponent}.
* The "glassed pane" is an invisible panel above the "content pane". It will
* catch all {@link MouseEvent}s, inform a {@link SecureMouseFocusObserver} about
* them, and then forward the events to the "content pane".
* [b]Note:[/b] clients can use {@link SecureDockController#wrap(JComponent)} to
* create and register a {@link GlassedPane} in one step.
* @author Benjamin Sigg
*/
public class GlassedPane extends JLayeredPane{
    /** An arbitrary component */
    private JComponent contentPane = new JPanel();
    /** A component lying over all other components. Catches every MouseEvent */
    private JComponent glassPane = new GlassPane();
    
    /**
     * Creates a new pane
     */
    public GlassedPane(){
        setLayout( null );
        setLayer( glassPane, 1 );
        setLayer( contentPane, 0 );
        add( glassPane );
        add( contentPane );
        setFocusCycleRoot( true );
    }
    @Override
    public void doLayout() {
        int width = getWidth();
        int height = getHeight();
        contentPane.setBounds( 0, 0, width, height );
        glassPane.setBounds( 0, 0, width, height );
    }

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

    /**
     * Sets the center panel of this GlassedPane.
     * @param contentPane the content of this pane, not <code>null</code>
     */
    public void setContentPane( JComponent contentPane ) {
        if( contentPane == null )
            throw new IllegalArgumentException( "Content Pane must not be null" );
        this.contentPane = contentPane;

        removeAll();

        setLayer( glassPane, 1 );
        setLayer( contentPane, 0 );
        
        add( glassPane );
        add( contentPane );
    }

    /**
     * Gets the content of this pane.
     * @return the content
     */
    public JComponent getContentPane(){
        return contentPane;
    }

    /**
     * Gets the transparent panel that is lying over the ContentPane.
     * @return the GlassPane
     */
    public JComponent getGlassPane(){
        return glassPane;
    }
   
    /**
     * A panel that lies over all other components of the enclosing GlassedPane.
     * This panel catches all MouseEvent, and informs the {@link GlassedPane#focusController focusController}
     * about the events.
     * @author Benjamin Sigg
     */
    private class GlassPane extends JPanel implements MouseListener, MouseMotionListener, MouseWheelListener{
        /** the component where a drag-event started */
        private Component dragged;
        /** the component currently under the mouse */
        private Component over;
        /** the number of pressed buttons */
        private int downCount = 0;

        /**
         * Creates a new GlassPane.
         */
        public GlassPane(){
            addMouseListener( this );
            addMouseMotionListener( this );
            addMouseWheelListener( this );

            setOpaque( false );
        }

        public void mouseClicked( MouseEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        public void mousePressed( MouseEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        public void mouseReleased( MouseEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        public void mouseEntered( MouseEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        public void mouseExited( MouseEvent e ) {
            if( !e.isConsumed() && isVisible() )
                send( e );

            if( !isVisible() ){
                downCount = 0;
            }
        }

        public void mouseDragged( MouseEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        public void mouseMoved( MouseEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        public void mouseWheelMoved( MouseWheelEvent e ) {
            if( !e.isConsumed() )
                send( e );
        }

        /**
         * Shorthand for <code>send( e, e.getID() );</code>.
         * @param e the event to send
         */
        private void send( MouseEvent e ){
            send( e, e.getID() );
        }

        /**
         * Dispatches the event <code>e</code> to the ContentPane or a child
         * of the ContentPane. Also informs the FocusManager about the event.
         * @param e the event to handle
         * @param id the type of the event
         */
        private void send( MouseEvent e, int id ){
            Point mouse = e.getPoint();
            Component component = SwingUtilities.getDeepestComponentAt( contentPane, mouse.x, mouse.y );

            boolean drag = id == MouseEvent.MOUSE_DRAGGED;
            boolean press = id == MouseEvent.MOUSE_PRESSED;
            boolean release = id == MouseEvent.MOUSE_RELEASED;
            boolean moved = id == MouseEvent.MOUSE_MOVED;
            boolean entered = id == MouseEvent.MOUSE_ENTERED;
            boolean exited = id == MouseEvent.MOUSE_EXITED;

            if( drag && dragged == null )
                dragged = component;
            else if( drag )
                component = dragged;

            if( press )
                downCount++;

            if( downCount > 0 && dragged != null )
                component = dragged;
            else if( downCount > 0 && dragged == null )
                dragged = component;
            else if( downCount == 0 )
                dragged = null;

            if( release ){
                downCount--;
                if( downCount < 0 )
                    downCount = 0;
            }

            if( moved || entered || exited ){
                if( over != component ){
                    if( over != null ){
                        over.dispatchEvent( new MouseEvent(
                                over, MouseEvent.MOUSE_EXITED, e.getWhen(), e.getModifiers(),
                                mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(),
                                e.getButton() ));
                    }

                    over = component;

                    if( over != null ){
                        over.dispatchEvent( new MouseEvent(
                                over, MouseEvent.MOUSE_ENTERED, e.getWhen(), e.getModifiers(),
                                mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(),
                                e.getButton() ));
                    }
                }
            }
           
            if( component == null ){
                setCursor( null );
                setToolTipText( null );
            }
            else{
                mouse = SwingUtilities.convertPoint( this, mouse, component );
                MouseEvent forward = new MouseEvent(
                        component, id, e.getWhen(), e.getModifiers(),
                        mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(),
                        e.getButton() );

                component.dispatchEvent( forward );
               
                Cursor cursor = component.getCursor();
                if( getCursor() != cursor )
                    setCursor( cursor );

                if( component instanceof JComponent ){
                    JComponent jcomp = (JComponent)component;
                    String tooltip = jcomp.getToolTipText( forward );
                    String thistip = getToolTipText();

                    if( tooltip != thistip ){
                        if( tooltip == null || thistip == null || !tooltip.equals( thistip ))
                            setToolTipText( tooltip );
                    }
                }
                else
                    setToolTipText( null );
            }
        }

        /**
         * Dispatches the event <code>e</code> to the ContentPane or one
         * of the children of ContentPane. Also informs the focusController about
         * the event.
         * @param e the event to dispatch
         */
        private void send( MouseWheelEvent e ){
            Point mouse = e.getPoint();
            Component component = SwingUtilities.getDeepestComponentAt( contentPane, mouse.x, mouse.y );
            if( component != null ){
                mouse = SwingUtilities.convertPoint( this, mouse, component );
                MouseWheelEvent forward = new MouseWheelEvent(
                        component, e.getID(), e.getWhen(), e.getModifiers(),
                        mouse.x, mouse.y, e.getClickCount(), e.isPopupTrigger(),
                        e.getScrollType(), e.getScrollAmount(), e.getWheelRotation() );

                component.dispatchEvent( forward );
            }
        }
    }
}
```


----------



## Guest (22. Jul 2008)

Die erste Version überschreibt die Methode "contains" und gibt immer "false" zurück. Wenn das System ein MouseEvent verschicken will, und rausfinden will, wohin das Event kommt, dann wird es diese erste Version nie beachten. Denn das System findet den Ursprung des MouseEvents indem es "contains" bei verschiedenen Componenten aufruft.
-> Bei der ersten Version fällt das MouesEvent "durch" die Component

Bei erster Version meinst du die GlassPaneDemo von Sun? Ich sehe aber nicht dass da irgendwo contains ueberschrieben wird...genau wie du unter beschreibst werden da alle MouseEvents abgefangen und neue MouseEvents generiert die dann verschickt werden.

Die zweite Version fängt alle MouseEvents ab. Dann sucht es selber die Component zu welcher das Event gehört und generiert ein neues Event welches es weiterschickt. Der Benutzer interagiert sozusagen nie mit den "verdeckten" Componenten sondern immer nur mit dem Glass-Pane, welches dann in einem zweiten Schritt mit den verdeckten Componenten interagiert.
-> Bei der zweiten Version wird das MouseEvent abgefangen und durch ein neues ersetzt.

Mit der zweiten Version meinst du deinen eigenen Code, oder? Wie der funktioniert have ich grob verstanden, bis auf die genauen Details um den SecureMouseFocusObserver, aber das ist wohl eher unwichtig.


Danke fuer den Code - ich schau es mir gleich an und versuche alles nachzuvollziehen.


P.S. ja, das mit dem maximize-minimize ist falsch, danke fürs erkennen :wink:

Gern geschehen


----------



## Beni (22. Jul 2008)

Nein, mit der ersten Version meine ich das hier :wink:


			
				Beni hat gesagt.:
			
		

> ```
> private class Overlay extends JPanel{
> public Overlay(){
> setOpaque( false );
> ...


----------



## Guest (22. Jul 2008)

Beni hat gesagt.:
			
		

> Nein, mit der ersten Version meine ich das hier :wink:
> 
> 
> 
> ...





Hehe...ok sorry fuer das Missverstaendnis. Jetzt kapier ich auch alle deine Erklaerungen


----------



## Guest (22. Jul 2008)

Anonymous hat gesagt.:
			
		

> Beni hat gesagt.:
> 
> 
> 
> ...




Eingentlich finde ich die erste Loesung gar nicht so schlecht...leider merk ich grade, dass dann Dinge wie Tooltips fuer das OverLay auch futsch sind.

Werde wohl irgendwas in Richtung Version 2 nutzen - danke!


----------



## Ratondeau (10. Okt 2008)

Danke für den Code Beni. Ich hatte ein ähnliches Problem und der Beitrag hat mir sehr viel Zeit gespart. :toll: 

Grüße
Matte


----------

