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

Status
Nicht offen für weitere Antworten.
J

Jezzy

Gast
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
 
B

Beni

Gast
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:
Code:
    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):
Code:
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 );

            }

        }

    }

}
 
J

Jezzy

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

Beni

Gast
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.
 
G

Guest

Gast
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.
 
B

Beni

Gast
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:
Code:
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;
	}
}
Code:
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 );
            }
        }
    }
}
 
G

Guest

Gast
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 ;)
 
B

Beni

Gast
Nein, mit der ersten Version meine ich das hier :wink:
Beni hat gesagt.:
Code:
    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 );
        }
 
G

Guest

Gast
Beni hat gesagt.:
Nein, mit der ersten Version meine ich das hier :wink:
Beni hat gesagt.:
Code:
    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 );
        }



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

Guest

Gast
Anonymous hat gesagt.:
Beni hat gesagt.:
Nein, mit der ersten Version meine ich das hier :wink:
Beni hat gesagt.:
Code:
    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 );
        }



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


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

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

Grüße
Matte
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Swing Durch GlassPane auf Button klicken und ActionEvent auslösen AWT, Swing, JavaFX & SWT 0
D GlassPane für JPanel AWT, Swing, JavaFX & SWT 2
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
B GlassPane setVisible(true) funktioniert nicht AWT, Swing, JavaFX & SWT 2
M JComboBox auf GlassPane-Panel AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
F GlassPane deaktiviert MouseKlicks nicht AWT, Swing, JavaFX & SWT 6
hdi Swing GUI Sperren mit GlassPane AWT, Swing, JavaFX & SWT 7
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
G Probleme mit Glasspane AWT, Swing, JavaFX & SWT 4
A GlassPane wird zu spät angezeigt AWT, Swing, JavaFX & SWT 2
G JDialog hinter Glasspane von JFrame. Geht das? AWT, Swing, JavaFX & SWT 3
TheJavaKid GlassPane AWT, Swing, JavaFX & SWT 5
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
C Frage zur GlassPane AWT, Swing, JavaFX & SWT 33
G Probleme mit GlassPane AWT, Swing, JavaFX & SWT 3
L GlassPane ein und abschalten AWT, Swing, JavaFX & SWT 3
J GlassPane - an Menupunkte herankommen AWT, Swing, JavaFX & SWT 2
M Problem mit GlassPane AWT, Swing, JavaFX & SWT 4
I GlassPane AWT, Swing, JavaFX & SWT 8
M Glasspane und dispatchen von Events AWT, Swing, JavaFX & SWT 6
U JXGraph Demo AWT, Swing, JavaFX & SWT 1
Guybrush Threepwood Very nice: Schicke Zusatzbibliothek und JavaFX-Demo AWT, Swing, JavaFX & SWT 3
T Demo klick gui erstellen und fenster verlinken AWT, Swing, JavaFX & SWT 5
J SwingX-Demo - mein Waterloo AWT, Swing, JavaFX & SWT 9
G Original JFC Tutorial Demo DragListDemo hat einen Bug! AWT, Swing, JavaFX & SWT 4
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben