MenuExplorer mit MouseListener

MScalli

Erfahrenes Mitglied
Hi Leutz.
Ich habe einen MenuExplorer(ein JInternalFrame das in einem JDesktopPane auf der linken Seite steht und auf und zu gefahren werden kann.. d.h. ein Menu das auf- und zugeklappt werden kann)
15 pixel breite des JInternalFrame bleiben, wenn das Fenster geschlossen ist, weitehin sichtbar.
Ich will jetzt, wenn ich mit dem Cursor über das Fenster gehe, das dieses geöffnet wird.
Wenn ich mit dem Cursor das Fenster verlasse wird dieses wieder eingefahren.

Soweit so gut. Das bekomme ich noch hin..
Code:
    frame = new JInternalFrame();
    frame.setSize(frameWidth, MyParam.getFrameHeight());
    frame.setLocation(0,0); 
    frame.setBorder(BorderFactory.createLineBorder(new Color(111,111,111), 2));
    frame.addMouseListener(new MouseListener(){

		@Override
		public void mouseClicked(MouseEvent arg0) {	
		}

		@Override
		public void mouseEntered(MouseEvent arg0) {
			System.out.println("Entered");

			  menuAusfahren(desktop);
			  open = true;
			  btn_auf_zu.setIcon(MyParam.PFEIL_LINKS);

		}

		@Override
		public void mouseExited(MouseEvent arg0) {
			System.out.println("Exited");

			  menuEinfahren(desktop);
			  open = false;
			  btn_auf_zu.setIcon(MyParam.PFEIL_RECHTS);	
		}

		@Override
		public void mousePressed(MouseEvent arg0) {	
		}

		@Override
		public void mouseReleased(MouseEvent arg0) {
		}
    	
    });

Und jetzt das Problem.
Auf diesem JInternalFrame befinden sich Buttons. Wenn ich jetzt mit der Maus über einen Button Fahre wird die Methode mouseExited auch aufgerufen, obwohl ich "eigentlich" das Fenster gar nicht verlasse. D.h. das Fenster wird auch geschlossen wenn ich über diesen Buttons bin.

Weiss jemand was ich da machen kann Denn die Buttons gehören ja zum Menu ;)

gruss
MScalli
 
Dann frägst du ab auf was die Maus zeigt, handelt es sich um solch einen Button(Menübutton) lässt du es offen.

mfg
 
Sorry aber ich habe keinen Schimmer wie ich das anstellen soll
Kleiner schubbs in die richtige Richtung wär ne Sache ;)
 
Wenn du deinen ganzen Code Postet(Komplett das ich es selbst starten kann) kann ich es selbst mal versuchen und dir meine Ergebnise geben.
 
Musste ich erst erstellen, das hat bisschen gedauert.. denn das Original Prog ist bisschen umfangreicher ;)

Ausserdem ist noch ein JTree auf diesem Menu.. Ich hoffe Das macht mir keine Probleme!!

Ich habs jetzt einfach mal ein ausführbares Prog ertellt, mit 1 JButton, damit es testen kannst..

Code:
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;

public class TestMenuExplorer {

	public static JDesktopPane desktop;
	static JInternalFrame iFrame;
	JFrame frame;
	
	TestMenuExplorer(){
		frame = new JFrame();
		frame.setSize(500,500);
		desktop = new JDesktopPane();
		iFrame = new JInternalFrame("Frame 1");
		iFrame.setLayout(null);
	    iFrame.addMouseListener(new MouseListener(){

			@Override
			public void mouseEntered(MouseEvent arg0) {
				menuAusfahren(desktop);
			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				menuEinfahren(desktop);
			}
			
			@Override
			public void mouseClicked(MouseEvent arg0) {	}
			@Override
			public void mousePressed(MouseEvent arg0) {	}
			@Override
			public void mouseReleased(MouseEvent arg0) { }

	    });
	
	
	    JButton btn = new JButton("test");
	    btn.setBounds(0,0,200,25);
	    iFrame.add(btn);
	
		iFrame.setBounds(0,0,200, 500);
		iFrame.setVisible(true);
		desktop.add(iFrame);
		frame.add(desktop);
		frame.setVisible(true);
	}
	
	public static void menuEinfahren(final Container desktop){
		    
		ExecutorService service = Executors.newSingleThreadExecutor();
		service.execute(new Runnable(){

		public void run(){
		    for (int i = 0; i > -iFrame.getWidth()+15; i--){

		        iFrame.setLocation(i, 0);
		        try{
		            Thread.sleep(0);
		        } catch (InterruptedException e){
		            e.printStackTrace();
		        }
		          desktop.repaint();
		     }
		 }
	});
	}// ENDE menuEinfahren
		  
	public static void menuAusfahren(final Container desktop){
		    
	ExecutorService service = Executors.newSingleThreadExecutor();
	service.execute(new Runnable(){

		public void run(){
		    for (int i = -iFrame.getWidth()+15; i < 0; i++){

			    iFrame.setLocation(i, 0);
			    try{
			            Thread.sleep(0);
			    } catch (InterruptedException e){
			        e.printStackTrace();
			    }
			    desktop.repaint();
			 }
		}
	 });
		  }// ENDE menuAusfahren 
	
	public static void main(String[] args) {
		new TestMenuExplorer();
	}
}
 
hab es versucht mit dem betreten von JDesktopPane zu lösen..
dies geht aber nur solange kein JInternalFrame darauf ist..

heisst ich bin wieder bei 0.. :(
 
Zuletzt bearbeitet:
hab ein paar kleinere Fehler behoben, aber ich brings einfach nicht hin das wenn ich über nen Button geh das ding offen bleibt.. plz help :)

Code:
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.plaf.basic.BasicInternalFrameUI;

public class TestMenuExplorer {

   public static JDesktopPane desktop;
   static JInternalFrame iFrame;
   JFrame frame;

   // Variable die angibt ob MenuExplorer bereits offen/geschlossen ist
   static boolean open = true;
   
   // Variable die angibt ob der MenuExplorer sich gerade öffnet/schliesst
   static boolean opening_closing = false;

   
   TestMenuExplorer(){
      frame = new JFrame();
      frame.setSize(500,500);
      desktop = new JDesktopPane();

      iFrame = new JInternalFrame("Frame 1");
      iFrame.setLayout(null);
       // Kopf des Fensters soll nicht angezeigt werden
       BasicInternalFrameUI ui = (BasicInternalFrameUI) iFrame.getUI();
       ui.setNorthPane(null);
       iFrame.addMouseListener(new MouseListener(){

         @Override
         public void mouseEntered(MouseEvent arg0) {
            System.out.println("mouseEntered");
            if(!opening_closing && !open){
               menuAusfahren(desktop);
            }
         }

         @Override
         public void mouseExited(MouseEvent arg0) {
            System.out.println("mouseExited");
            if(!opening_closing && open){
               menuEinfahren(desktop);
            }
         }
         @Override
         public void mouseClicked(MouseEvent arg0) {   }
         @Override
         public void mousePressed(MouseEvent arg0) {   }
         @Override
         public void mouseReleased(MouseEvent arg0) { }

       });
   
   
       JButton btn = new JButton("test");
       btn.setBounds(0,0,200,25);
       iFrame.add(btn);
   
      iFrame.setBounds(0,0,200, 500);
      iFrame.setVisible(true);
      desktop.add(iFrame);
      frame.add(desktop);
      frame.setVisible(true);
   }
   
   public static void menuEinfahren(final Container desktop){
      
      opening_closing = true;
      
      ExecutorService service = Executors.newSingleThreadExecutor();
      service.execute(new Runnable(){

         public void run(){
             for (int i = 0; i > -iFrame.getWidth()+15; i--){
   
                 iFrame.setLocation(i, 0);
                 try{
                     Thread.sleep(0);
                 } catch (InterruptedException e){
                     e.printStackTrace();
                 }
                   desktop.repaint();
              }
          }
      });
      
      opening_closing = false;
      open = false;
   }// ENDE menuEinfahren
       
   public static void menuAusfahren(final Container desktop){
      
      opening_closing = true;
         
      ExecutorService service = Executors.newSingleThreadExecutor();
      service.execute(new Runnable(){

         public void run(){
             for (int i = -iFrame.getWidth()+15; i < 0; i++){
   
                iFrame.setLocation(i, 0);
                try{
                        Thread.sleep(0);
                } catch (InterruptedException e){
                    e.printStackTrace();
                }
                desktop.repaint();
             }
         }
       });
      
      opening_closing = false;
      open = true;
   }// ENDE menuAusfahren
   
   public static void main(String[] args) {
      new TestMenuExplorer();
   }
}
 
Ich habs jetzt so ziemlich in jeder richtung probiert.. sogar mit MouseMotionListener.. wenn man die Maus langsam bewegt würde es gehen... lol.. das kanns nicht sein!!

Hier mal ein Stand wie es eigentlich gehen müsste.. nur das die Variable on_btn einfach zu spät gesetzt wird(also mouseExited des JInternalFrames wird früher aufgerufen als mouseEntered des JButton so wie ich das sehe)

Code:
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.plaf.basic.BasicInternalFrameUI;

public class TestMenuExplorer {

	public static JDesktopPane desktop;
	static JInternalFrame iFrame;
	JFrame frame;

	// Variable die angibt ob MenuExplorer bereits offen/geschlossen ist
	static boolean open = true;
	
	// Variable die angibt ob der MenuExplorer sich gerade öffnet/schliesst
	static boolean opening_closing = false;
	
	// Variable die angibt ob Komponente auf dem MenuExplorer steht
	static boolean on_explorer = false;
	
	// Variable die angibt ob man sich über dem JButton befindet
	static boolean on_btn = false;

	
	TestMenuExplorer(){
		frame = new JFrame();
		frame.setSize(500,500);
		desktop = new JDesktopPane();

	    JButton btn = new JButton("test");
	    btn.setBounds(0,0,200,25);
	    btn.addMouseListener(new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent arg0) {	
			}

			@Override
			public void mouseEntered(MouseEvent arg0) {
				System.out.println("Mouse Entered JButton");
				on_btn = true;
				
			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				System.out.println("Mouse Exited JButton");
				on_btn = false;
				
			}

			@Override
			public void mousePressed(MouseEvent arg0) {	
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {	
			}
	    });
		
		iFrame = new JInternalFrame("Frame 1");
		iFrame.setLayout(null);
	    // Kopf des Fensters soll nicht angezeigt werden
	    BasicInternalFrameUI ui = (BasicInternalFrameUI) iFrame.getUI();
	    ui.setNorthPane(null);
	    iFrame.addMouseListener(new MouseListener(){

			@Override
			public void mouseEntered(MouseEvent arg0) {
				System.out.println("mouseEntered");
				if(!opening_closing && !open){
					menuAusfahren(desktop);
				}
			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				System.out.println("mouseExited");
				
				// on_btn ist hier immer false weil mouseEntered vom JButton später ausgeführt wird!
				System.out.println("on_btn           = " + on_btn);
				System.out.println("open             = " + open);
				System.out.println("openbing_closing = " + opening_closing);
				
				if(!opening_closing && open && !on_btn){
					menuEinfahren(desktop);
				}
			}
			@Override
			public void mouseClicked(MouseEvent arg0) {	}
			@Override
			public void mousePressed(MouseEvent arg0) {	}
			@Override
			public void mouseReleased(MouseEvent arg0) { }

	    });
	
	

	    iFrame.add(btn);
	
		iFrame.setBounds(0,0,200, 500);
		iFrame.setVisible(true);
		desktop.add(iFrame);
		

		frame.add(desktop);
		frame.setVisible(true);
	}
	
	public static void menuEinfahren(final Container desktop){
		 
		opening_closing = true;
		
		ExecutorService service = Executors.newSingleThreadExecutor();
		service.execute(new Runnable(){

			public void run(){
			    for (int i = 0; i > -iFrame.getWidth()+15; i--){
	
			        iFrame.setLocation(i, 0);
			        try{
			            Thread.sleep(0);
			        } catch (InterruptedException e){
			            e.printStackTrace();
			        }
			          desktop.repaint();
			     }
			 }
		});
		
		opening_closing = false;
		open = false;
	}// ENDE menuEinfahren
		  
	public static void menuAusfahren(final Container desktop){
		
		opening_closing = true;
		    
		ExecutorService service = Executors.newSingleThreadExecutor();
		service.execute(new Runnable(){

			public void run(){
			    for (int i = -iFrame.getWidth()+15; i < 0; i++){
	
				    iFrame.setLocation(i, 0);
				    try{
				            Thread.sleep(0);
				    } catch (InterruptedException e){
				        e.printStackTrace();
				    }
				    desktop.repaint();
				 }
			}
	    });
		
		opening_closing = false;
		open = true;
	}// ENDE menuAusfahren 
	
	public static void main(String[] args) {
		new TestMenuExplorer();
	}
}

Helft mir bitte, das will einfach nicht
 
Habe es jetzt mal mit ner GlassPane versucht..Problem liegt jetzt aber darin das der Button jetzt actionPerformed nicht mehr ausführt..

Code:
import java.awt.Container;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.plaf.basic.BasicInternalFrameUI;

public class TestMenuExplorer implements MouseListener, ActionListener {

   public static JDesktopPane desktop;
   static JInternalFrame iFrame;
   JFrame frame;

   // Variable die angibt ob MenuExplorer bereits offen/geschlossen ist
   static boolean open = true;
   
   // Variable die angibt ob der MenuExplorer sich gerade öffnet/schliesst
   static boolean opening_closing = false;

   
   TestMenuExplorer(){
       frame = new JFrame();
       frame.setSize(500,500);
       desktop = new JDesktopPane();

       iFrame = new JInternalFrame("Frame 1");
       iFrame.setLayout(null);
       
       // Kopf des Fensters soll nicht angezeigt werden
       BasicInternalFrameUI ui = (BasicInternalFrameUI) iFrame.getUI();
       ui.setNorthPane(null);
       
       iFrame.getGlassPane().setBounds(new Rectangle(0,0,50,50));
       iFrame.getGlassPane().addMouseListener(this);
       iFrame.getGlassPane().setVisible(true);

       JButton btn = new JButton("test");
       btn.addActionListener(this);
       btn.setBounds(0,0,200,25);
       iFrame.add(btn);
   
       iFrame.setBounds(0,0,200, 500);
       iFrame.setVisible(true);
       desktop.add(iFrame);
       frame.add(desktop);
       frame.setVisible(true);
   }
   
   public static void menuEinfahren(final Container desktop){
      
      opening_closing = true;
      
      ExecutorService service = Executors.newSingleThreadExecutor();
      service.execute(new Runnable(){

         public void run(){
             for (int i = 0; i > -iFrame.getWidth()+15; i--){
   
                 iFrame.setLocation(i, 0);
                 try{
                     Thread.sleep(0);
                 } catch (InterruptedException e){
                     e.printStackTrace();
                 }
                   desktop.repaint();
              }
          }
      });
      
      opening_closing = false;
      open = false;
   }// ENDE menuEinfahren
       
   public static void menuAusfahren(final Container desktop){
      
      opening_closing = true;
         
      ExecutorService service = Executors.newSingleThreadExecutor();
      service.execute(new Runnable(){

         public void run(){
             for (int i = -iFrame.getWidth()+15; i < 0; i++){
   
                iFrame.setLocation(i, 0);
                try{
                        Thread.sleep(0);
                } catch (InterruptedException e){
                    e.printStackTrace();
                }
                desktop.repaint();
             }
         }
       });
      
      opening_closing = false;
      open = true;
   }// ENDE menuAusfahren
   
public static void main(String[] args) {
    new TestMenuExplorer();
}

public void actionPerformed(ActionEvent arg0) {
	System.out.println("Button Action");	
}
public void mouseEntered(MouseEvent arg0) {
   System.out.println("mouseEntered");
   if(!opening_closing && !open){
      menuAusfahren(desktop);
   }
}
public void mouseExited(MouseEvent arg0) {
   System.out.println("mouseExited");
   if(!opening_closing && open){
      menuEinfahren(desktop);
   }
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}

}

wenn ich das auskommentiere
Code:
iFrame.getGlassPane().setVisible(true);
ist die glasspane aber nicht mehr da, aber der button geht..
hiiiiilllfffeeeeeeeee :(
 
Ich schreib jetzt nochmal in der Hoffnung das mir doch noch jemand helfen kann.
Denn ich glaub langsam ich bin echt auf ner völlig falschen fährte.

Mein Ziel: Ein MenuExplorer der beim drüber fahren aufklappt und beim verlassen wieder zuklappt.. aber die Komponenten die darauf liegen müssen ansprechbar bleiben

Ich habe schon soviel Probiert und denke das die Lösung in dieser richtung liegt..
Das heisst ich lege ein glassPane drüber und hole mir das darunter liegende Component.
Dies geht auch soweit. Aber wie kann ich jetzt den ActionListener dieses Komponents "aktivieren" bzw. wie kann ich es bewerkstellen das der Button(und später auch ein JTree) funktioniert?

Der Code ist zwar nicht viel anderst als der letzte aber ich poste Ihn trotzdem(paar Kleinigkeiten sinds doch.

Bitte versucht es.. es ist ein ausführbarer Code und mal kurz rein schauen kostet nur paar Sekunden.. denn ich weiss echt nicht mehr weiter.

Code:
import java.awt.Container;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameUI;

public class TestMenuExplorer implements MouseListener, ActionListener {

   public static JDesktopPane desktop;
   static JInternalFrame iFrame;
   JFrame frame;

   // Variable die angibt ob MenuExplorer bereits offen/geschlossen ist
   static boolean open = true;
   
   // Variable die angibt ob der MenuExplorer sich gerade öffnet/schliesst
   static boolean opening_closing = false;

   
   TestMenuExplorer(){
       frame = new JFrame();
       frame.setSize(500,500);
       desktop = new JDesktopPane();

       iFrame = new JInternalFrame("Frame 1");
       iFrame.setLayout(null);
       
       // Kopf des Fensters soll nicht angezeigt werden
       BasicInternalFrameUI ui = (BasicInternalFrameUI) iFrame.getUI();
       ui.setNorthPane(null);
       
       iFrame.getGlassPane().setBounds(new Rectangle(0,0,50,50));
       iFrame.getGlassPane().addMouseListener(this);
       iFrame.getGlassPane().setVisible(true);

       JButton btn = new JButton("test");
       btn.setName("test");
       btn.addActionListener(this);
       btn.setBounds(0,0,200,25);
       btn.addMouseMotionListener(new MouseMotionListener(){

		@Override
		public void mouseDragged(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseMoved(MouseEvent arg0) {
			System.out.println("löl");
			
		}
    	   
       });
       iFrame.add(btn);
   
       iFrame.setBounds(0,0,200, 500);
       iFrame.setVisible(true);
       desktop.add(iFrame);
       frame.add(desktop);
       frame.setVisible(true);
   }
   
   public static void menuEinfahren(final Container desktop){
      
      opening_closing = true;
      
      ExecutorService service = Executors.newSingleThreadExecutor();
      service.execute(new Runnable(){

         public void run(){
             for (int i = 0; i > -iFrame.getWidth()+15; i--){
   
                 iFrame.setLocation(i, 0);
                 try{
                     Thread.sleep(0);
                 } catch (InterruptedException e){
                     e.printStackTrace();
                 }
                   desktop.repaint();
              }
          }
      });
      
      opening_closing = false;
      open = false;
   }// ENDE menuEinfahren
       
   public static void menuAusfahren(final Container desktop){
      
      opening_closing = true;
         
      ExecutorService service = Executors.newSingleThreadExecutor();
      service.execute(new Runnable(){

         public void run(){
             for (int i = -iFrame.getWidth()+15; i < 0; i++){
   
                iFrame.setLocation(i, 0);
                try{
                        Thread.sleep(0);
                } catch (InterruptedException e){
                    e.printStackTrace();
                }
                desktop.repaint();
             }
         }
       });
      
      opening_closing = false;
      open = true;
   }// ENDE menuAusfahren
   
public static void main(String[] args) {
    new TestMenuExplorer();
}

public void actionPerformed(ActionEvent arg0) {
	System.out.println("Button Action");	
}
public void mouseEntered(MouseEvent arg0) {
   System.out.println("mouseEntered");
   
   if(!opening_closing && !open){
      menuAusfahren(desktop);
   } 
}
public void mouseExited(MouseEvent arg0) {
   System.out.println("mouseExited");
   if(!opening_closing && open){
      menuEinfahren(desktop);
   }
}
public void mouseClicked(MouseEvent e) {
	Point mouse = e.getPoint();
	System.out.println("Component : " + SwingUtilities.getDeepestComponentAt(iFrame.getContentPane(), mouse.x, mouse.y));
	System.out.println("Name      : " + SwingUtilities.getDeepestComponentAt(iFrame.getContentPane(), mouse.x, mouse.y).getName());
	

}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}

}
 
Zurück