Hallo Java-Community,
ich habe mal wieder eine Frage:
Für mein "kleines" Programm möchte ich eine grafische SWING-Komponente JLine und JPolyline entwerfen. Die Klassen sollen das tun, was ihr Name auch schon verrät ;-).
Ansich dachte ich, dass die Sache nicht schwer sei und ich habe mir einmal folgenden Code ausgedacht:
und JPolyline eben entsprechend mit einer Linienliste oder -vektor.
Wie gesagt, obige Klasse habe ich noch nicht ausprogrammiert, aber so sollte ja alles richtig sein, oder?
Schön und gut, nun habe ich aber ein Problemchen entdeckt:
Im obigen Code ist es schon angedeutet, dass ich, wenn die Maus sich über der Linie befindet, die Linie in rot zeichnen möchte, andernfalls in schwarz.
Bei einer vertikalen, bzw. horizontalen Linie habe ich kein Problem, aber bei einer schrägen Linie bekomme ich ein großes Problem: der MouseListener registriert das Überfahren der Maus, selbst wenn sich der Mauszeiger nicht direkt über der gezeichneten schwarzen/roten Linie befindet. Das Problem ist ja, dass die Komponente rechteckige Bounds hat und dementsprechend wird immer ein Überfahren registriert, wenn sich die Maus innerhalb der Bounds der JComponent aufhält.
Das möchte ich aber genau nicht! Ich möchte, dass der MouseListener nur was registriert, wenn sich die Maus direkt über der gezeichneten Linie befindet! Kann man da irgendwie was machen? Muss man da vielleicht irgendne Methode von JComponent überschreiben (schön wäre, wenns da so ne Methode wie detectIfMouseIsOver geben würde, die man einfach geeignet überschreiben müsste)?
Mich wundert eigentlich, dass es dazu nicht schon Komponenten im Internet gibt, oder ist das Problem einfach zu billig?
Vielen Dank für Eure Hilfe
Liebe Grüße
gpxricky
ich habe mal wieder eine Frage:
Für mein "kleines" Programm möchte ich eine grafische SWING-Komponente JLine und JPolyline entwerfen. Die Klassen sollen das tun, was ihr Name auch schon verrät ;-).
Ansich dachte ich, dass die Sache nicht schwer sei und ich habe mir einmal folgenden Code ausgedacht:
Code:
public class JLine extends JComponent implements MouseListener {
private int x1 = 0;
private int y1 = 0;
private int x2 = 0;
private int y2 = 0;
private boolean mouseOver = false;
public void paintComponent(Graphics g) {
// setBounds der Komponente entsprechend der nötigen Größe berechnen
if (x2 > x1) {
if (y2 > y1) {
this.setBounds(x1, y1, x2-x1, y2-y1);
} else {
this.setBounds(x1, y2, x2-x1, y1-y2);
}
} else {
if (y2 > y1) {
this.setBounds(x2, y1, x1-x2, y2-y1);
} else {
this.setBounds(x2, y2, x1-x2, y1-y2);
}
}
if (mouseOver) {
// Mit Graphics2d eine rote Linie zeichnen
...
} else {
// Mit Graphics2d eine schwarze Linie zeichnen
...
}
}
}
und JPolyline eben entsprechend mit einer Linienliste oder -vektor.
Wie gesagt, obige Klasse habe ich noch nicht ausprogrammiert, aber so sollte ja alles richtig sein, oder?
Schön und gut, nun habe ich aber ein Problemchen entdeckt:
Im obigen Code ist es schon angedeutet, dass ich, wenn die Maus sich über der Linie befindet, die Linie in rot zeichnen möchte, andernfalls in schwarz.
Bei einer vertikalen, bzw. horizontalen Linie habe ich kein Problem, aber bei einer schrägen Linie bekomme ich ein großes Problem: der MouseListener registriert das Überfahren der Maus, selbst wenn sich der Mauszeiger nicht direkt über der gezeichneten schwarzen/roten Linie befindet. Das Problem ist ja, dass die Komponente rechteckige Bounds hat und dementsprechend wird immer ein Überfahren registriert, wenn sich die Maus innerhalb der Bounds der JComponent aufhält.
Das möchte ich aber genau nicht! Ich möchte, dass der MouseListener nur was registriert, wenn sich die Maus direkt über der gezeichneten Linie befindet! Kann man da irgendwie was machen? Muss man da vielleicht irgendne Methode von JComponent überschreiben (schön wäre, wenns da so ne Methode wie detectIfMouseIsOver geben würde, die man einfach geeignet überschreiben müsste)?
Mich wundert eigentlich, dass es dazu nicht schon Komponenten im Internet gibt, oder ist das Problem einfach zu billig?
Vielen Dank für Eure Hilfe
Liebe Grüße
gpxricky