Swing Maus Rastersprung

Status
Nicht offen für weitere Antworten.

washpuda

Mitglied
Hallo Leute 😀,


ich möchte mal so ne art CAD Programm schreiben, da ich diese für eine Problemlösung benötige.

Schwierigkeiten macht mir momentan der Mauszeiger, der soll bei aktivem Raster nur die Rasterpunkte anspringen. Es gibt zwar die Möglichkeit mir Robot MausMove die Position des Mauszeigers anzupassen, was irgendwie nicht sehr Ideal ist.


Beispiel Raster 10 Pixel. Wenn Zeiger auf Rasterpunkt und ich die Maus um 1 Pixel verschiebe wird bevor die Mausmotionmethode aufgerufen wird der Mauszeiger bereits verschoben (soll nicht sein, weil). In der Methode selbst berechne ich zwei Mauspositionen, eine wo sich der Zeiger tatsächlich befindet und eine dynamische wo sich der Zeiter ohne Rastersprung befinden würde. In der Methode wird über das Robotobjekt der Zeiger auf den nächsten Rasterpunkt gesetzt (es wird automatisch nochmal die Mausmotionmethode aufgerufen die ich jetzt über eine Flag überspringe);

Wenn allein der Rastersprung berechnet in der Mausroutine aktiviert ist sieht es sehr gut aus, da das zurückspringen auf den nächsten Rasterpunkt sehr schnell geht. Aber um so voller die Methode wird, um so störender wird das hin und herspringen des Mauszeigers.


Gibt es die Möglichkeit in Java den Mauszeiger zu entkoppeln, so das bei Mausbewegung lediglich die Mousemotionmethode aufgerufen wird, der Zeiger jedoch nur von Hand gesetzt wird.

Wie sieht es aus, wenn ich den Mauszeiger ausblende, und meine eigenen Mauszeiger über die PaintMethode male. Hat hier jemand erfahrung.


private void RasterFang(MouseEvent e) {

Java:
  try {
       Robot robot = new Robot();
	int dX = 0, dY = 0;
	dX = e.getX() - this.bProp.aktXMausPos;
	dY = e.getY() - this.bProp.aktYMausPos;
	Point scrLocation = this.builderPanel.getLocationOnScreen();

	this.bProp.aktXMausPos = e.getX();
            this.bProp.aktYMausPos = e.getY();

	if (this.robotMove) {
	this.bProp.virtXMausPos += dX;
	this.bProp.virtYMausPos += dY;

	int dXStep = this.bProp.virtXMausPos % this.bProp.xRasterStep;
	int dYStep = this.bProp.virtYMausPos % this.bProp.yRasterStep;

	if (dXStep >= this.bProp.xRasterStep / 2) {
		dXStep = this.bProp.xRasterStep - dXStep;
		} else {
		dXStep = -dXStep;}

	if (dYStep >= this.bProp.yRasterStep / 2) {
	dYStep = this.bProp.yRasterStep - dYStep;
	} else {
	dYStep = -dYStep;}
	e.translatePoint(10, 10);
	robot.mouseMove(scrLocation.x + this.bProp.virtXMausPos
		+ dXStep, scrLocation.y + this.bProp.virtYMausPos
		+ dYStep);
		robotMove = false;} else {robotMove = true;} /
		} catch (AWTException e1) {

			e1.printStackTrace();
		}

	}
 
sehr unwahrscheinlich das du das bewegen des Mauszeigers verhindern kannst, ich wüsste keine Methode außer eben das nachträgliche zurücksetzen über die Robot#mouseMove Methode.

Wie sieht es aus, wenn ich den Mauszeiger ausblende, und meine eigenen Mauszeiger über die PaintMethode male. Hat hier jemand erfahrung.
Sobald der echte unsichtbare Mauszeiger am Rand des Bildschirms angekommen ist, werden keine MouseMotion-Events mehr gesendet. Deswegen müsstest du den echten unsichtbaren Mauszeiger immer z.b. in der Mitte des Bildschirms halten (über Robot#mouseMove). Ansonsten würde das funktionieren, musst halt nur drauf achten das es nicht zu Benutzerunfreundlich wird.
 
Ich habe gerade mal versucht den Mauszeiger über die Paintmethode zu zeichnen.

In der MouseMotionroutine rufe ich jeweils

Java:
this.builderPanel.repaint(new Rectangle(e.getX()-8,e.getY()-8,16,16));

für die neue MauszeigerPosition auf und für die alte. Denn Mauscursor selbst blende ich aus, indem ich über den Cusomcursor einen leeren transparenten Cursour übergebe.

Um zu testen ob dies auch bei voller Paintmethode flüssig läuft, zeichne ich einfach 1000 Linien. Es Funktioniert sehr gut keine verzögerung feststellbar.

Wenn die Zeichenfläche verlassen wird, wird automatisch der Mauszeiger wiederhergestellt, da ja nur der leere Mauszeiger für das Panel gilt in dem ich Zeichne.

Beim Verlassen des Zeichenpanels bleibt jedoch noch der selbstgezeichnete Cursor stehen, was sich sicherlich noch über die exited-Methode beseitigen läst.
 
Ein bißchen subjektiver Senf: Ich halte es für HÖCHST fragwürdig, den Mauszeiger mit einem Robot zu bewegen. Dafür ist ein Robot nicht da! Ich würde eher (bzw. habe in meinem "CAD"-Programm schon) ein Kreuzchen an der gesnappten Position malen - ggf. kann man dann auch den echten Mauszeiger ausblenden... So ähnlich hast du das jetzt auch (vor)?!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben