MouseEvent beenden

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,
mich würde mal interessieren, wie ich einen MouseEvent wieder unterbrechen kann. Folgender Code dazu:

Code:
MouseListener w = new MouseListener() {
			public void mouseEntered(MouseEvent ev) {
				while(do()){
					incrX();
					incrY();

					center.x = getX();
					center.y = getY();
					center.repaint();
					IO.println("Mouse ist obenlinks" + x);
                                }

				
			}

			public void mouseReleased(MouseEvent ev) {
			}

			public void mouseClicked(MouseEvent ev) {
			}

			public void mouseExited(MouseEvent ev) {
				
			}

			public void mousePressed(MouseEvent ev) {
			}

		};

		topLeft.addMouseListener(w);

Wie man sieht, soll der MouseEvent solange aktiv sein, bis do() false wird. Mein Problem ist, dass ich das so offensichtlich nicht machen kann. ich habe schon versucht in
Code:
public void mouseExited(MouseEvent ev) {
				
			}
do() auf false zu setzen aber offensichtlich fragt die while-schleife nur eine instanz der in do() benutzten boolean variable ab. Wie kann ich also den MouseEvent solange durchlaufen lassen, bis ich die Maus wegbewege?
 
2 Punkte:

Erstens darfst du nicht längere Zeit in der mouseEntered-Methode aufhalten, weil sonst die GUI einfriert
und auch keine repaints mehr ausgeführt werden. Also keine Do-Schleife

Zweitens wird die mouseEntered-Methode nur einmal aufgerufen; eben wenn die Maus deine
Komponente betritt.

Du mußt zusätzlich noch den MouseMotionListener implementieren bei der du
durch mouseMoved-Events auf jede Mausbewegung hingewiesen wirst. In dieser
Methode kannst du dann einen einzelnen Schritt (Koordinatenveränderung, repaint)
ausführen.
 
ok, ersteinmal vielen Dank für die schnelle Antwort. Kannst du mir vielleicht ein kleines Beispiel geben? Haben den Code nun so verändert:

Code:
MouseListener w = new MouseListener() {
			public void mouseEntered(MouseEvent ev) {
				
					incrX();
					incrY();

					center.x = getX();
					center.y = getY();
					center.repaint();
					IO.println("Mouse ist obenlinks" + x);
					
									
			}

			public void mouseReleased(MouseEvent ev) {
				
			}
			
			public void MouseMoved(MouseEvent ev){
				
			}

			public void mouseClicked(MouseEvent ev) {
				
			}

			public void mouseExited(MouseEvent ev) {
				
			}

			public void mousePressed(MouseEvent ev) {
			}

		};

		topLeft.addMouseListener(w);

Wo setzte ich jetzt den MouseMotionListener an?
 
Wie gesagt: Der MouseListener bringt nichts. Es muß schon der MouseMotionListener sein:

Code:
topLeft.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent ev) { 
               incrX(); 
               incrY(); 
               center.x = getX(); 
               center.y = getY(); 
               center.repaint(); 
               if ("Maus ist wirklich oben links")
                   IO.println("Mouse ist obenlinks" + x); 
         }});

Ähh! Wo benutzt du denn die Koordinaten der Maus? Der Parameter ev wird doch nie benutzt :shock:
 
Wie frage ich am besten ist maus oben links ab? MouseEntered liefer ja leider kein true oder false. Ich müsste aber schon eine Fläche benutzen können und nicht, dass ich die Koordinaten abfrage.

Müsste es auch nicht eher so aussehen?

Code:
		topLeft.addMouseMotionListener(new MouseMotionAdapter() {
	        public void mouseMoved(MouseEvent ev) {
	              
	               
	               //MouseKoords abfragen
	               if ("maus obenlinks")
	            	   incrX();
	               incrY();
	               center.x = getX();
	               center.y = getY();
	               center.repaint();
	                   IO.println("Mouse ist obenlinks" + x);
	         }});

damit das Bild. welches sich in center befindet nur verschiebt, wenn mouse obenlinks ist?
 
Wie wärs mit
Code:
if (ev.getX() < 10 && ev.getY() < 10)

Genau die Koordinate [0,0] zu erwischen ist wohl nicht zu empfehlen
 
Ahh verstehe. Ales klar. getX und getY geben allerdings noch nicht die Mauskoordinaten zurück sondern vielmehr in wie weit sich das Bild verschieben soll. Es geht im Grunde um das Scrollen per Bereich wie in vielen Spielen beispielsweise üblig.
 
hätte da noh eine Frage. Ich habe nun folgenden Code:

Code:
topLeft.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseMoved(MouseEvent ev) {

				// MouseKoords abfragen
				if (ev.getX() < 40 && ev.getY() < 40) {
					incrX();
					incrY();
					center.x = getX();
					center.y = getY();
					center.repaint();
					IO.println("Mouse ist obenlinks" + x);
				}
			}
		});

An sich funktioniert es wunderbar nur soll alles im if rumpf so lange ausgeführt werden (so oft) bis die Maus den bereich x<40 und y<40 verlässt.

Wie mache ich das? Mit while denke ich mal nicht oder?
 
Deine Frage beantwortet sich schon teilweise selbst.

so lange ausgeführt werden (so oft) bis die Maus den bereich x<40 und y<40 verlässt
so lange bis -> while

Also setzt du das Ganze in eine while-Schleife:
Code:
while (ev.getX() < 40 && ev.getY() < 40) { 
  incrX(); 
  incrY(); 
  center.x = getX(); 
  center.y = getY(); 
  center.repaint(); 
  IO.println("Mouse ist obenlinks" + x); 
}
 
Das mache ich und IO.println gibt auch wunderbar die verschiebung aus aber repaint() funktioniert nicht und die while-Bedingung wird auch nicht mehr berücksichtigt.D.h. Endlocschleife 🙁
 
In dem Fall mußt du einen eigenen Thread starten, der deine Anweisungen
in einer while Schleife ausführt. Gesteuert wird dieser Thread durch die
mouseMoved-Methode. Also ungefähr so:

Code:
boolean isRunning = false;
boolean stopRun = true;

class Move implements Runnable {
	public void run() {
		isRunning = true;
		stopRun = false;
		while (!stopRun && !(getX() == 0 && getY() == 0)) {
			"verschiebe dein WasAuchImmer"

			// Etwas warten. Millisekundenwert mußt du ausprobieren
			try {Thread.sleep(20)} catch (InterruptedException e) {stopRun = true;}
		}
		isRunning = false;
	}
}
...
public void mouseMoved(MouseEvent e) {
	if (e.getX() < 40 && e.getY() < 40) {
		if (!isRunning)
			new Thread(new Move()).start();
	} else {
		stopRun = true;
	}
}
 
@lokiht: Endlosschleife weil ev.getX/Y() immer denselben Wert haben (Koordinaten bei Aufruf der Methode)

@Lectron: Nicht dein Tag heute 😎

*SCNR* weil deine Beiträge sonst immer gut sind
 
Uuuppss! Blöder Fehler von mir 😳

Wenn dein "WasAuchImmer" die obere linke Ecke erreicht hat, wird der Bewegungsthread
zwar beendet, bei kleinen Mausbewegungen in der MouseMoved-Methode aber sinnlos neu gestartet,
gleich beendet, ...

Die Startbedingung sollte also heißen:

Code:
if (!isRunning && !(getX()==0 && getY()==0)
...
 
hehe. Danke. Werde ich gleich mal ausprobieren. Mal gucken ob es geht. Danke für die Hilfe->ich habe bestimmt noch fragen
 
Ok und wieder ein Problem. Mal geht es und mal nicht. Folgenden Code benutze ich jetzt:

Code:
boolean isRunning = false;
	boolean stopRun = true;

	class obenLinks implements Runnable {
	   public void run() {
	      isRunning = true;
	      stopRun = false;
	      while (!stopRun && !(getX() == 0 && getY() == 0)) {
	         
	    		incrX();
				incrY();
				center.x = getX();
				center.y = getY();
				center.repaint(2);
				IO.println("Mouse ist obenlinks" + x);
	         // Etwas warten. Millisekundenwert mußt du ausprobieren
	         try {Thread.sleep(30);} catch (InterruptedException e) {stopRun = true;}
	      }
	      isRunning = false;
	   }
	}
	

	public JPanel getTopLeft() {
		topLeft = new JPanel();
		topLeft.setBackground(Color.GRAY);
		topLeft.setBackground(Color.BLACK);

		// ActionListener

		topLeft.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
			   if (e.getX() < 40 && e.getY() < 40) {
			      if (!isRunning && !(getX()==0 && getY()==0));
			         new Thread(new obenLinks()).start();
			   } else {
			      stopRun = true;
			   }
			} 
			
		});

		return topLeft;
	}
 
Code:
            incrX(); 
            incrY(); 
            center.x = getX(); 
            center.y = getY(); 
            center.repaint(2);

- Was macht incrX/Y()? Sollte es nicht eher decrX/Y() heißen?
- Was ist center?
- Was bedeutet der Parameter 2 im repaint()-Aufruf? Eine eigene überladene repaint-Methode?
- Was für ein Typ ist die umgebende Klasse? JPanel?

Fragen über Fragen 🙁

Falls du es noch nicht selbst gelöst hast solltest du vielleicht mal deinen Code
mit notwendigem Kontext posten. Oder, falls es nicht zu groß ist, das ganze Programm.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben