MouseEvent

CodeKrieger

Mitglied
Hallo,

trotz Googeln bin ich mir immernoch unsicher, ob bei der manuellen Erzeugung eines MouseEvents die Koordinaten X und Y absolut oder relativ sein sollen?

Also
geben die an, WO das MouseEvent stattfindet oder wie man dahin kommt?

Beispiel: Ich bin beim Punkt (200, 300) und möchte den Zeiger zum Punkt (100, 100) bewegen. Muss ich dann ein MouseEvent erzeugen mit
-X = 100, Y = 100 oder eins mit
-X = 100, Y = 200?

Auch unsicher bin ich ob das Bildschirm- oder Fensterkoordinaten sein sollen.

Ein Robot kommt leider nicht in Frage, er bewegt die Maus zu ruckartig.
 
S

SlaterB

Gast
A) beides ausprobieren?!

B) hast du schon die Möglichkeit bedacht,
dass so ein Event nur ein Event sein mag und vielleicht irgendwelche Listener in deinem Programm beschäftigt,
aber nicht die Betriebssystem-kontrolliere Maus bewegt?

kannst du auf Links zu dem Thema aufbauen oder sind das bisher deine eigenen Ideen?
na vielleicht interessierst du dich nur für die Programmauswirkungen
 

Marco13

Top Contributor
...
aber nicht die Betriebssystem-kontrolliere Maus bewegt?

... und ich dachte jetzt kurz über eine Maus mit zwei kleinen Elektromotoren nach, ... ... ... :reflect: (Wird Zeit für den Feierabend...)

@TO: Man könnte die Maus mit einem Robot bewegen, aber immer nur ein kleines Stück, in einem Thread, bis die Zielposition erreicht ist.
 

CodeKrieger

Mitglied
Ein Listener ist da, sie bewegt sich ja auch, nur an die falsche Stelle.

Den Witz mit den Elektromotoren kapier ich nicht so ganz.

Ja ich werd es jetzt mal ausprobieren, wenn das keiner mit Sicherheit sagen kann. Aber es wäre mir eine große Hilfe wenn mir jemand das sagen kann, denn ich bin beim Fehlersuchen und will das nur ausschließen, dass es daran liegt. Sonst muss ich alle Tests 2x machen.

Mein Projekt (Masterarbeit) ist leider nicht ganz so einfach und ich habs schon in meinen anderen Threads ansatzweise versucht zu erklären. Deshalb geht ein Robot wirklich nicht.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das mit den Elektromotoren kapiert man wohl nur, wenn man so alt ist, dass man schonmal eine Maus mit Kugel in der Hand hatte...
 

CodeKrieger

Mitglied
Nun, dazu kann ich wohl nur sagen, dass ich sehr wohl noch Windows 3.11 kenne und auch schon solche Mäuse in der Hand hatte. So jung bin ich daher auch nicht mehr.
 
S

SlaterB

Gast
> Sonst muss ich alle Tests 2x machen.

um das zu testen musst du genau jede Variante 1x machen,
ganz abgesehen von den 20 anderen Tests, die zu so etwas komplexen wie Mouse-Bewegung dazugehören,
Bewegung hin zu Randbereich, Richtungswechsel, gleichzeitige User-Mausbewegung und was auch immer,

wenn so ein Test lange dauert und mit anderen Aktionen vermischt wird, dann läuft generell was falsch, was du ändern solltes,

ich würde es sagen wenn ich es sicher wüßte, ich glaube ich weiß aber kaum was du da genau machst
 

CodeKrieger

Mitglied
Also das Problem ist erstmal folgendes. Ich will ein MouseEvent generieren, dass den Zeiger an eine bestimmte Stellt zurückbringt. Dies klappt nicht. Der Zeiger macht was er will.

Eine sehr seltsame Sache ist mir jetzt aufgefallen

MouseEvent hat ja die Methoden GetXOnScreen() und getYOnScreen(). Ich rufe den Konstruktur

Java:
public void correctMousePos(){
      //Methode mit MouseEvent        
        MouseEvent me;        
        me = new MouseEvent(this, //where
                        MouseEvent.MOUSE_MOVED, //what
                        System.currentTimeMillis(), //when
                        0, //modifiers
                        50, //x
                        50, //y
                        0, //Clicks
                        false); 
        System.out.println(me.getX()+", "+me.getY());
        System.out.println(me.getXOnScreen()+", "+me.getYOnScreen());
        mouseMoved(me); 
      
  }
auf, also ohne absolutKoordinaten. Das komische ist, dass die absolutKoordinaten nichts, aber auch garnichts mit der Position zu tun haben. Ich habe nen FullHD Monitor, Das Canvas Elemet hat je Auslösung von 640.480. In der rechten oberen Ecke spuckt das Ding aus

50, 50
53, 126

Bei jedem weiteren Aufruf der obigen Methode genau die gleichen Werte, auch wenn sich die Maus bewegt hat.

Irgendwas stimmt hier ganz und garnicht. Das mouseEvent wird ja bei jedem Aufruf neu erzeugt. Also ist irgendwo in dem Konstruktur der Wurm drin, der aus meinen x, y Werten die absolutWerte berechnet.

Hier mal ein Link zur API MouseEvent (Java Platform SE 6), int, long, int, int, int, int, boolean)

Vielleicht kann mir ja einer sagen was ich hier falsch mache.

Die Komplexität meines Projekts kommt eigentlich erst später ins Spiel, wenn die Maus sich etwa so bewegt wie sie soll. Da habe ich dann auch Forschungsergebnisse, die sagen ich soll die Maus höchstens 100px bewegen usw. Mein Problem ist, dass die Maus sich nicht annähernd so verhält wie sie soll.
 

CodeKrieger

Mitglied
So, das Problem ist endlich gelöst. :applaus::toll:

Vielleicht hilft es ja noch jemandem, hier der korrekte Code
Java:
public void correctMousePos(){
     
      //Methode mit MouseEvent
      int stepSize = 100;
      int tempX, tempY;
      MouseEvent me;
      int deltaX = Math.abs(save.getX() - last.getX());
      int deltaY = Math.abs(save.getY() -last.getY());
      int stepsX = (int)Math.ceil(deltaX / stepSize);
      int stepsY = (int)Math.ceil(deltaY / stepSize);
      int sigX = (int)Math.signum(save.getX() - last.getX());//gives the direction (+ or -)
      int sigY = (int)Math.signum(save.getY() -last.getY());
      System.out.println("start:"+ last.getX()+", "+last.getY());
      
      while(stepsX > 0 || stepsY > 0){
            //distinguish between different deltas
            if(stepsX > 0 && stepsY == 0){
                tempX = last.getX() + sigX * stepSize;
                tempY = save.getY();
                stepsX--;
            }
            else if(stepsX == 0 && stepsY > 0){
                tempX = save.getX();
                tempY = last.getY() + sigY * stepSize;
                stepsY--;
            }
            else {
                tempX = last.getX() + sigX * stepSize;
                tempY = last.getY() + sigY * stepSize;
                stepsX--;
                stepsY--;
            }                
            me = new MouseEvent(this, //where
                        MouseEvent.MOUSE_MOVED, //what
                        System.currentTimeMillis(), //when
                        0, //modifiers
                        tempX, //x
                        tempY, //y
                        0, //Clicks
                        false); 
            mouseMoved(me);
            try{
                Thread.sleep(60);
            }
            catch(Exception e){
                e.printStackTrace();
            } 
            System.out.println("temp :"+me.getX()+", "+me.getY());
        
         
      }
      //do the last step that is smaller than stepSize
      if(last.getX() != save.getX() || last.getY() != save.getY()){
        me = new MouseEvent(this, //where
                        MouseEvent.MOUSE_MOVED, //what
                        System.currentTimeMillis(), //when
                        0, //modifiers
                        save.getX(), //x
                        save.getY(), //y
                        0, //Clicks
                        false); 
        mouseMoved(me);
      }
      System.out.println("last :"+last.getX()+", "+ last.getY());
      System.out.println("saved: "+save.getX()+", "+ save.getY());
      
  }
 public void saveMousePos(){
     save = last;
 }

save und last sind MouseEvents. Mein größter Fehler war, dass ich mit screenKoordinaten und Fensterkoordinaten durcheinandergekommen bin. MouseEvents benötigt Fensterkoordinaten, der Robot aber Screenkoordinaten. Nachdem das erstmal gefixt war, hatte ich nur noch kleine Bugs ausfindig zu machen.

Der Code arbeitet jetzt sauber unter allen getesteten Gast-OS, d.H. windows 3.11, 95 und 98. Die Sleep-Time ist in diesen OS erforderlich um die Mausevents korrekt zu verarbeiten. Die Entfernung darf auch nicht größer als 126px sein.
 
Ä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
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 beenden AWT, Swing, JavaFX & SWT 17
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

Ähnliche Java Themen

Neue Themen


Oben