Problem mit eigenem Menu Explorer

Status
Nicht offen für weitere Antworten.

MScalli

Bekanntes Mitglied
Hi Leutz.
Habe diese Frage schon mal in nem anderen Forum gestellt, leider konnte mir bis jetzt niemand helfen.
Ich hab nen Menu Explorer, d.H es ist ein JInternalFrame auf nem JDesktopPane das rein und raus fährt.
Dies soll wenn man über dieses Fenster geht rein und wieder raus gefahren werden.
Leider habe ich das Problem das wenn ich über einen Button auf diesem Fenster fahre dieses auch zugeht(klar, weil ich "verlasse" ja das Fenster.
Es über das DesktopPane zu machen geht nicht, denn wenn ein weiteres InternalFrame geöffnet ist betrete ich dieses ja nicht..
Lange rede kurzer sinn.. Hier mal ein Ausführbares Programm damit Ihr wisst was ich meine..


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;
	static boolean ueber_button = true;
	static boolean offen = true;
	
	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) {
				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();
	}
}


Ausserdem hab ich bei nem langsameren Rechner das Problem das der Explorer zu langsam rein fährt und ich diesen dazwischen verlassen kann.. heisst er würde gleichzeitig rein UND raus fahren.. sieht bisschen komisch aus, wird aber warscheinlich keiner nachvollziehen können 😉

Hoffe jemand kann mir helfen!

gruss
MScalli
 
Hi,

also ich hab das mal ausgeführt. Das erste Problem ist schonma, dass das das Event für den MouseListener mehr als nur einmal ausgeführt wird. Das solltest du mit einer boolschen Variable beheben. (Solange der Mauszeiger im "ausfahrbaren Teil ist, das Event nicht ausführen, erst wieder beim Verlassen). Ich denke, dass das Problem mit dem "langsamen" Rechner auch dadurch gelöst wird.
Das Problem mit dem Button kannst du lösen, indem du vor dem Verlassen die Komponenten auf deinem InternalFrame geben lässt. Befindet sich der Mauszeiger auf einer dieser Komponenten, dann eben das Schließen nicht ausführen.

edit: Ach ja und so lange dein Thread läuft, der das Fenster verchiebt, solltest du natürlich auch alle Events blocken...
 
also soweit bin ich mal..
nur das mit den Komponenten abfragen bekomme ich nicht wirklich hin, heisst betritt er gerade eine komponente die auf meinem MenuExporer geaddet ist..

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();
	}
}
 
Was heißt bekommst du nicht hin??

in der Mouse exited schauen ob der Mauszeiger über dem Button liegt...
 
also ich habe versucht die Komponenten die auf dem Frame sind alle in ner Schleife durchzugehen und bei jeder Komponente(bis jetzt nur Buttons) habe ich eine Variable (menu_component) auf true gesetzt wenn sie den Button betreten(mouseEntered) und dieses dann auch in die Abfrage mit eingebaut.

Aber da ist dann gar nichts mehr gegangen weil ich ehrlich gesagt nicht genau was zuerst passiert..
mouseEntered bei den JButtons oder mouseExited bei dem JFrame..


Ausserdem konnte ich mir net vorstellen das du es so meinst das ich bei jedem betreten bzw. verlassen des MenuExplorers die ganzen Components wieder alle durchgehe und nen MouseListener adde..
Ich glaub irgendwie hab ich mich da richtig schön verfahren?!?!?!
 
also mit ner Variablen gehts nicht(schauen ob die Maus über nem JButton liegt.
Gibts da noch ne andere möglichkeit??

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();
	}
}
 
Das ist auch keine Lösung..
Das funktioniert nur wenn man nicht zu schnell mit der Maus ins/aus dem Fenster fährt..

Code:
import java.awt.Container;
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.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(){
	    	boolean test= false;

			@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");
				test = 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.addMouseMotionListener(new MouseMotionListener(){

			@Override
			public void mouseDragged(MouseEvent e) {	
			}

			@Override
			public void mouseMoved(MouseEvent e) {
				System.out.println("x=" + e.getX());
				System.out.println("y=" + e.getY());
				
				if(e.getX() > 198 && open){
					menuEinfahren(desktop);
					open = false;
				}
				
				if(e.getX() < 198 && !open){
					menuAusfahren(desktop);
					open = true;
				}	
			}
	    });
	
	

	    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();
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben