MouseEvents unter Unix anders als unter Windows

wookenny

Erfahrenes Mitglied
Hallo,

für die Uni schreibe ich grade meine erste graphische Oberfläche in Java.

Habe folgendes Problem:

Es sollen bei Klicks Punkte gemalt werden und wenn man von einem bereits gemalten Punkt zu einem anderen zieht, soll eine Linie dazwischen gemalt werden.

Klappt unter Windows(hier bei mir alles wunderbar).
Zum Punktmalen nehme mouseClicked.
Zum Ziehen benutzte ich mousePressed als Anfang und mouseReleased als Ziel.

Unter Unix wird wenn man nun die MouseTaste drückt und von a nach b zieht.
Als erstes bei a ein mousePressed Event, dann bei b ein MouseReleasedEvent und danach noch ein MouseClickedEvent bei b.
Win wirft hier nur MousePressed und MouseReleased.

Dieser macht bei dem Programm ziemlich viel Ärger, man kann nämlich keine Linien markieren. Woher kommen die unterschiedlichen Events? was kann ich dagegen machen?

Danke für die Zeit.
schones Pfingstfest
wookenny
 
Hallo!

Unterschiedliche OS verarbeiten MouseEvents nun mal unterschiedlich, daran kann auch java nichts ändern. Wie wär's denn wenn du deinen Code so abänderst, dass du mittels mousePressed zwei Punkte markierst? Das funktioniert nämlich IMHO überall.

Gruß Tom
 
Hmmm.....

Also ich möchte die Info der Art haben: Maus bei a geklickt und bei b losgelassen.
Ich weiss nicht, wie ich das mit MousePressed hinbekommen kann.

Ich könnte es natürlich auch so umbauen, das es auf Unix klappt, dann aber wäre unter Windows nicht mehr gut, das widerspricht ja dem schönen Javakonzept ja einwenig.

mfg
wookenny
 
Danke dir, aber das hilft nicht wirklich.
Zum einen werden dann massig Events zuviel geschmissen, die ich nicht brauche.
Zum anderen wird beim Loslassen der Maustaste wieder der böse MouseClicked Event geworfen.

Aber ich hab da die Idee, das MouseClicked zu stören, indem MouseReleased die Zeit speichert und wenn MouseClicked in ner sehr geringen Abweichung kommt, leite ich das nicht weiter, das sollte klappen und auch unter beiden Betriebssystemen laufen.

schöne Grüße
(ich fahr jetzt zum Grill-Spielabend)
 
Hallo!

Wie wär's denn damit?
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/**
 * @author Tom
 * 
 */
public class LineDemo extends JFrame {

	Point p0, p1;

	public LineDemo() {
		super("LineDemo");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				if (SwingUtilities.isRightMouseButton(e)) {
					p0 = null;
					p1 = null;
					return;
				}

				if (p0 != null) {
					p1 = e.getPoint();
					getGraphics().drawLine(p0.x, p0.y, p1.x, p1.y);
					p0 = p1;
				} else {
					p0 = e.getPoint();
				}

			}
		});

		setSize(320, 240);
		setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new LineDemo();
	}
}

Gruß Tom
 
Hab es jetzt schön hinbekommen.
Jetzt läufts auf beiden Systemen optimal.
Danke, dass du dir die Mühe gemacht hast Code zu schreiben.
War allerdings nocht etwas anders als das, was ich meinte.
(Ich wollte jeweils immer sowas wissen wie: Benutzer hat Mouse von a nach b gedragged.)

Aber jetzt ist alles gut.
 
Ich verzichte jetzt völlig auf den MouseClickedEvent.
Jetzt wird bei MousePressed, die x,y Position gespeichert und bei MouseReleased wieder verarbeitet.

Wenn bei MouseRealesed dieselbe x,y ermittelt werden, wie sie vorher gespeichert wurden, wird die Methode, die MouseClicked aufrufen sollte, gerufen.
Wenn es eine andere Position ist, wurde halt von der ersten zur 2.ten Position gezogen.

Edit: Ich hatte mir erst noch was anderes überlegt, aber als ich heute morgen nach Hause kam, hatte einer der beiden anderen Gruppenmitglieder das geändert und auf den CVS Server geladen.
Schöne Sache sowas, wenn man Nichts dran verändet und es plötzlich funktioniert.
Zur Information wir schreiben ein Programm das bis jetzt so Dinge wie Dijkstra und Breitensuche und später noch viele weitere Graphen - und Netzwerkalgorithemn können soll.
 
Zuletzt bearbeitet:
Zurück