MouseEvent beenden

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?
 

Leroy42

Top Contributor
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.
 

lokiht

Aktives Mitglied
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?
 

Leroy42

Top Contributor
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:
 

lokiht

Aktives Mitglied
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?
 

Leroy42

Top Contributor
Wie wärs mit
Code:
if (ev.getX() < 10 && ev.getY() < 10)

Genau die Koordinate [0,0] zu erwischen ist wohl nicht zu empfehlen
 

lokiht

Aktives Mitglied
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.
 

lokiht

Aktives Mitglied
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?
 

L-ectron-X

Gesperrter Benutzer
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); 
}
 

lokiht

Aktives Mitglied
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 :(
 

Leroy42

Top Contributor
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;
	}
}
 

Leroy42

Top Contributor
@lokiht: Endlosschleife weil ev.getX/Y() immer denselben Wert haben (Koordinaten bei Aufruf der Methode)

@Lectron: Nicht dein Tag heute :cool:

*SCNR* weil deine Beiträge sonst immer gut sind
 

Leroy42

Top Contributor
Uuuppss! Blöder Fehler von mir :oops:

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)
...
 

lokiht

Aktives Mitglied
hehe. Danke. Werde ich gleich mal ausprobieren. Mal gucken ob es geht. Danke für die Hilfe->ich habe bestimmt noch fragen
 

lokiht

Aktives Mitglied
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;
	}
 

Leroy42

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
padde479 MenuItem MouseEvent/-Listener AWT, Swing, JavaFX & SWT 5
MouseEvent richtig initialisieren AWT, Swing, JavaFX & SWT 1
S JavaFX Fehler zwischen View und Controller bei MouseEvent (MVC) AWT, Swing, JavaFX & SWT 13
C MouseEvent JavaFX AWT, Swing, JavaFX & SWT 4
L MouseEvent-Konflikt AWT, Swing, JavaFX & SWT 1
S JavaFX Unterschied MouseEvent und ActionEvent AWT, Swing, JavaFX & SWT 3
A Mouseevent Vorrang AWT, Swing, JavaFX & SWT 10
X Swing MouseEvent auslösen AWT, Swing, JavaFX & SWT 3
C MouseEvent AWT, Swing, JavaFX & SWT 8
R MouseEvent.getX() liefert in Applet Screen-Koordinate AWT, Swing, JavaFX & SWT 2
T JLabel adden bei einem MouseEvent AWT, Swing, JavaFX & SWT 2
F AWT MouseEvent - consume() funktioniert nicht AWT, Swing, JavaFX & SWT 6
S JButton + MouseEvent AWT, Swing, JavaFX & SWT 2
J Swing JButton und MouseEvent AWT, Swing, JavaFX & SWT 2
C Swing Problem mit MouseEvent in JTable AWT, Swing, JavaFX & SWT 5
L "Fremdes" JPanel von MouseEvent aus Ändern AWT, Swing, JavaFX & SWT 2
F MouseEvent bei PopupMenu abfangen AWT, Swing, JavaFX & SWT 2
B Button identifizieren unter MouseEvent AWT, Swing, JavaFX & SWT 7
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
B mouseReleased(MouseEvent m) überflüssig? AWT, Swing, JavaFX & SWT 2
E MouseEvent von Kindelementen abfangen AWT, Swing, JavaFX & SWT 2
S Zugriff auf statische Var in MouseEvent -> Warnung AWT, Swing, JavaFX & SWT 6
A Problem mit Jframe und mouseevent AWT, Swing, JavaFX & SWT 10
B kein MouseEvent bei zu schneller Bewegung der Maus AWT, Swing, JavaFX & SWT 7
R JButton in JList - MouseEvent-Problem AWT, Swing, JavaFX & SWT 12
A MouseEvent auf Container bzw. Frame weiterleiten AWT, Swing, JavaFX & SWT 5
M mouseEvent an darunterliegende Komponenten weiterleiten AWT, Swing, JavaFX & SWT 2
M MouseEvent JButton Taschenrechner AWT, Swing, JavaFX & SWT 5
X MouseEvent selber auslösen AWT, Swing, JavaFX & SWT 12
H mouseEvent AWT, Swing, JavaFX & SWT 6
G jList + mouseevent (rechtsklick) AWT, Swing, JavaFX & SWT 1
G MouseEvent Problem mit JFrame über einen modalen JDialog AWT, Swing, JavaFX & SWT 3
G JTree MouseEvent AWT, Swing, JavaFX & SWT 6
M MouseEvent in der EventQueue vor versetzen AWT, Swing, JavaFX & SWT 4
sliwalker MouseEvent,JKomponente aus Array: Wie bekommt man den Index AWT, Swing, JavaFX & SWT 2
H MouseEvent bei Drag & Drop (mittels TransferHandler) AWT, Swing, JavaFX & SWT 3
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
D JafaFX Anwendung beenden AWT, Swing, JavaFX & SWT 11
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
T ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec AWT, Swing, JavaFX & SWT 1
S Event Handling konsole Programm mit Tastendruck beenden AWT, Swing, JavaFX & SWT 5
I Swing Menu->Beenden AWT, Swing, JavaFX & SWT 6
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
P Vor Beenden änderungen prüfen AWT, Swing, JavaFX & SWT 2
R Endlosschleife auf JButton druck beenden AWT, Swing, JavaFX & SWT 9
S AWT Fenster schließen und Programm beenden AWT, Swing, JavaFX & SWT 10
F Swing Beenden eines ActionListener über einen Button AWT, Swing, JavaFX & SWT 8
E Swing CellEditor bei Fokusverlust Bearbeitung beenden?! AWT, Swing, JavaFX & SWT 6
J Java-Applet beenden AWT, Swing, JavaFX & SWT 3
T Java Applet beenden AWT, Swing, JavaFX & SWT 2
S Gridlayout - Tabellenzeile "beenden" AWT, Swing, JavaFX & SWT 3
P Mouse Listener beenden AWT, Swing, JavaFX & SWT 14
E windowClosing() - JFrame nicht durch X knopf gleich beenden? AWT, Swing, JavaFX & SWT 9
M Programm beenden AWT, Swing, JavaFX & SWT 10
S Thread beenden, wenn Component nicht mehr benötigt wird AWT, Swing, JavaFX & SWT 12
J Fenster schließen ohne das Programm zu beenden AWT, Swing, JavaFX & SWT 3
G java.awt Vollbild beenden AWT, Swing, JavaFX & SWT 6
M JTable: TableCellEditor nach Eingabe sofort beenden? AWT, Swing, JavaFX & SWT 3
T DIALOG für BEENDEN AWT, Swing, JavaFX & SWT 11
R Beenden Dialog beim Schließen AWT, Swing, JavaFX & SWT 2
S Bei SWT den Windows beenden Button manipulieren? AWT, Swing, JavaFX & SWT 4
U Anwendung nicht beenden beim form schliessen? AWT, Swing, JavaFX & SWT 6
M KeyEvent - Programm mit ESC beenden AWT, Swing, JavaFX & SWT 7
G "Alte" Instanzen beenden AWT, Swing, JavaFX & SWT 2
S Anwendung über Button beenden? AWT, Swing, JavaFX & SWT 4
N Beenden-Dialog mit "Beenden" und "Abbrechen&q AWT, Swing, JavaFX & SWT 2
V Zweimal klicken um Modalen Dialog zu beenden? AWT, Swing, JavaFX & SWT 15
S JPopupMenu - Kontrolliert beenden AWT, Swing, JavaFX & SWT 3
B JOptionDialog mit Enter Beenden? AWT, Swing, JavaFX & SWT 5
L JOP.showInputDialog: Abbrechen Button-Funktion beenden AWT, Swing, JavaFX & SWT 5
X Fenster schließen aber nicht beenden AWT, Swing, JavaFX & SWT 9
S "Millionen" von Threads? Programm komplett beenden AWT, Swing, JavaFX & SWT 2
J CellEditor per Button beenden AWT, Swing, JavaFX & SWT 2
K Programm lässt sich nicht beenden AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben