Koordinaten des Mouselistener nicht überall gleich

Letavino

Aktives Mitglied
Hallo,
ich schreibe gerade eine grafische Anwendung, die mit dem Mouselistener arbeitet.
Dieser soll herausfinden, wohin der User geklickt hat.
Nun musste ich allerdings feststellen, dass die Koordinaten, die er lädt nicht auf allen Rechnern identisch sind.
Ich frage die Koordinaten mit
Java:
x = e.getX()
und
Java:
y = e.getY()
ab.

Auf diesem Rechner sind die Koordinaten immer die gleichen, klickt man den gleichen Punkt an.
Auf dem Schulrechner sind sie um ein paar Pixel verschoben.
Wie kommt das zustande? Evtl. wegen veralteter Java Version?
Und wie kann man diesen Effekt abfangen?

Dieser Computer: Windows Vista SP2, Java Updates immer installiert
Schulcomputer: Windows XP Prof., Computer wird immer auf Installationsstand zurückgesetzt, daher wohl ziemlich veraltete Java Version

Das Problem ist einfach, dass ein tadellos funktionierendes Programm dort nicht korrekt arbeitet, wobei Plattformunabhängigkeit doch eigentlich die Stärke von Java sein sollte.

(Ebenfalls getestet mit aktuellem und leistungsstarkem Windows 7 Prof. PC, da funktioniert auch alles korrekt.)

Mit freundlichem Gruß,
Letavino
 
ziemlich ungenau beschrieben, was heißt denn konkret 'ein paar Pixel'?
geht es nur um eine bestimmte Dimension, x oder y?
sind die Pixel dennoch korrekt, wenn etwa mit paintComponent genau an der Stelle etwas gezeichnet wird?

Abweichungen können sich vielleicht schon durch unterschiedliche Bildschirmauflösungen, andere Darstellung von Rändern/ Headern ergeben, die alles bisschen verschieben,
ist die Übereinstimmung hier wichtig?
 
ziemlich ungenau beschrieben, was heißt denn konkret 'ein paar Pixel'?
geht es nur um eine bestimmte Dimension, x oder y?

Ich kann es leider nur grob bestimmen, da ich an den Schulcomputer im Moment nicht dran komme.
Wir haben in der paintComponent Methode mit drawImage ein Bild über das ganze Fenster zeichnen lassen und einen bestimmten Punkt angeklickt.
Hier sind die Koordinaten etwa (34|135), dort waren sie etwa (30|128).
(Ein wenig Abweichung ist möglich)

sind die Pixel dennoch korrekt, wenn etwa mit paintComponent genau an der Stelle etwas gezeichnet wird?

Beim Zeichnen verschiedener Komponenten ist auf beiden Computern kein Unterschied festzustellen.

Abweichungen können sich vielleicht schon durch unterschiedliche Bildschirmauflösungen, andere Darstellung von Rändern/ Headern ergeben, die alles bisschen verschieben,
ist die Übereinstimmung hier wichtig?

Die Übereinstimmung ist in sofern wichtig, als dass wir das Fenster, in dem das Programm läuft, in Felder mit 20px * 20px eingeteilt haben. Klickt man in eins dieser Felder, wird der obere linke Punkt des Feldes als Startpunkt einer Zeichnung verwendet.
Bei dieser Verschiebung kommt es allerdings vor, dass das falsche Feld verwendet wird, obwohl man in das richtige hineinklickt, was unerwünschte Folgen hat.

Gruß
 
> Bei dieser Verschiebung kommt es allerdings vor, dass das falsche Feld verwendet wird, obwohl man in das richtige hineinklickt, was unerwünschte Folgen hat.

das wäre dann ja schon eine Abweichung entgegen
> Beim Zeichnen verschiedener Komponenten ist auf beiden Computern kein Unterschied festzustellen.
wobei du vielleicht an die unterschiedlichen Computer gedacht hast,

ich meine ob in beiden funktioniert, einen Pixel anzuklicken, und mit diesen Komponenten einen Pixel in paintComponent zu färben,
oder einen kleinen Kreis zu machen, der dann genau richtig sitzt?

anhand der Felder scheint das nicht der Fall zu sein..,
kannst du bisschen zum Code posten, gar ein komplettes Programm? vielleicht habe ich zufällig auch einen 'nicht funktionierenden' Rechner 😉 ,
oder ich kann etwas nach Layout-Besonderheiten, Insets usw. schauen
 
was wären denn dort die unterschiedlichen Parameter, source und destination?
wenn man verschiedene Panels hat, die mit Layout und Abstand ineinanderliegen, dann hätte man ja eine allgemeine Erklärung,
nicht aber unbedingt für unterschiedliches Verhalten auf verschiedenen Rechnern, wobei dies eher denkbar wäre
 
> Bei dieser Verschiebung kommt es allerdings vor, dass das falsche Feld verwendet wird, obwohl man in das richtige hineinklickt, was unerwünschte Folgen hat.

das wäre dann ja schon eine Abweichung entgegen
> Beim Zeichnen verschiedener Komponenten ist auf beiden Computern kein Unterschied festzustellen.
wobei du vielleicht an die unterschiedlichen Computer gedacht hast,
Dann sag ich mal: Optisch ist kein Unterschied bei beiden Rechner feststellbar, aber das muss ja auch nichts heißen, wenn alle Pixel um den gleichen Wert verschoben sind.

ich meine ob in beiden funktioniert, einen Pixel anzuklicken, und mit diesen Komponenten einen Pixel in paintComponent zu färben,
oder einen kleinen Kreis zu machen, der dann genau richtig sitzt?

Ich würde es gerne testen, aber ich komme leider bis zur Präsentation des Projekts an keinen Schulcomputer mehr ran.

anhand der Felder scheint das nicht der Fall zu sein..,
kannst du bisschen zum Code posten, gar ein komplettes Programm? vielleicht habe ich zufällig auch einen 'nicht funktionierenden' Rechner 😉 ,
oder ich kann etwas nach Layout-Besonderheiten, Insets usw. schauen

Das Programm ist mittlerweile auf 1000 bis 2000 Zeilen Code in verschiedenen Klassen angewachsen.
Dazu ist es noch vollkommen unkommentiert, da ich bisher der einzige war, der daran gearbeitet hat und ich auch so bisher noch den vollen Durchblick habe. Kommentare füge ich aber noch an.
Deswegen will ich ungern jemanden zumuten,sich dadurch zu kämpfen, nur um mir zu helfen.
Sooo gravierend ist der Fehler ja auch nicht. 😉

Ach ja, ich habe gerade gesehen, dass ich am Anfang zum testen folgenden Code verwendet habe, um den oberen linken Punkt eines Feldes richtig zu bestimmen und seither hab ich daran nicht geändert:

Java:
sourceX = e.getX()-10 - ((e.getX()-10) % 20);
sourceY = e.getY()-30 - ((e.getY()-30) % 20);

Schon da musste ich nachkorrigieren und hab es seitdem leider nicht mehr beachtet. Kann es damit zutun haben?
(Ich hoffe, es ist einigermaßen verständlich, sonst bitte nachfragen. 😉 )

Gruß!
 
> Kann es damit zutun haben?

denkbar ist alles, zu den genannten 4/7 Pixel-Abweichung passt das nicht unbedingt,
kommt darauf was das im weiteren bewirkt,

also zusammenfasst: ja/nein/vielleicht 😉

um auf ganze 20er zu runden vielleicht geeigneter:
Java:
int n = 20;
sourceX = (e.getX()-10)/n*n;
sourceY = (e.getY()-30)/n*n;;
da int/int im positiven Bereich abgerundet wird

------

> Sooo gravierend ist der Fehler ja auch nicht.

wenn der Mausklick nicht das Feld darunter trifft, wäre das schon kritisch
 
Vielen Dank für den Codevorschlag! 🙂

Den Abzug von 10 bzw. 30 musste ich vornehmen, da der 0 Punkt des Fensters dort zu liegen scheint.
Java:
drawImage(image, 0, 0, this);
zeichnet das Bild "image" aber korrekt in dieser Ecke.

Wo kommt diese Abweichung denn her? Wenn hier Ränder mit berücksichtigt werden, kann es sein, dass diese bei XP vielleicht eine leichte Abweichung gegenüber Vista / Windows 7 haben?
Ich suche mir mal einen XP Rechner und teste das mal.

Gruß!
 
Zuletzt bearbeitet von einem Moderator:
> Wo kommt diese Abweichung denn her?

ohne dein konkretes Programm kann man das kaum klären,
wenn du einem JFrame einen MouseListener zuweist, rechnet der vielleicht von oben links vom Fenster aus, wo erstmal 20 Pixel Header-Balken erfolgen,
ein JPanel als ContentPane hat dagegen 0,0 genau da wo es auch zu malen beginnt, unterhalb des Headers,
logischerweise sollte auch der MouseListener auf diesem Panel registiert werden, dann müsste alles pixelgenau übereinstimmen,

wenn du also dahingehend etwas mit festen Zahlen korrigierst, sind Abweichungen auf verschiedenen Rechnern nicht verwunderlich,
- stelle das entweder ganz ab durch korrekten Listener,
- verwende die Methode von bygones, kenne ich nicht so genau,
- ober verwende zum Abzug konkrete Werte, z.B. liefert getInsets() auf das JFrame (evtl. erst NACH setVisible(true))

Code:
java.awt.Insets[top=23,left=4,bottom=4,right=4]
was 23 Pixel für den Header oben ausdrückt usw.
 
Häng' den MouseListener an die Component, in der mit
drawImage(image, 0, 0, this);
das Bild gezeichnet wird, dann stimmen die Koordinaten auch. Wenn der Listener an einer übergeordneten Component (im schlimmsten Fall dem Frame) hängt, kommt es zu den angesprochenen Problemen, weil die Titeleiste eben mal 23 und mal 31.9 Pixel hoch ist...
 
Häng' den MouseListener an die Component, in der mit
drawImage(image, 0, 0, this);
das Bild gezeichnet wird, dann stimmen die Koordinaten auch. Wenn der Listener an einer übergeordneten Component (im schlimmsten Fall dem Frame) hängt, kommt es zu den angesprochenen Problemen, weil die Titeleiste eben mal 23 und mal 31.9 Pixel hoch ist...

Dann liege ich ja mit meiner letzten Vermutung genau richtig, denn ich habe den MouseListener an dem Frame hängen.
Also muss ich ihn an die paintComponent hängen?
Schickt dort einfach ein
Java:
this.addMouseListener(this);
in dieser Componente? Denn nur damit funktioniert es noch nicht.

Gruß!
 
wenn du einen Compilerfehler genauer benennen kannst ist es wahrscheinlich leicht zu korrigieren,
wenn aber niemand mehr auf die Maus reagiert, wirds schwieriger

ganz offensichtlich kann rein aus einer Codezeile mit bekannten Befehlen und Verweigerung jeglicher sonstiger Informationen nichts gelesen werden
 
wenn du einen Compilerfehler genauer benennen kannst ist es wahrscheinlich leicht zu korrigieren,
wenn aber niemand mehr auf die Maus reagiert, wirds schwieriger

ganz offensichtlich kann rein aus einer Codezeile mit bekannten Befehlen und Verweigerung jeglicher sonstiger Informationen nichts gelesen werden

Ok, ich denke, ab hier werde ich es auch so schaffen.
Das eigentliche Problem ist ja nun gefunden und sollte sich nicht allzu schwer lösen lassen.
Ich danke euch für die wirklich gute Hilfe! 🙂

Mfg, Letavino
 

Zurück
Oben