Neue Komponente erstellen - Fragen/Probleme mit MouseEvents

Status
Nicht offen für weitere Antworten.

gpxricky

Mitglied
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:

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
 
R

Roar

Gast
warum überprüfst du nicht in der methode mouseMoved oder was du dafür benutzt ob die mausposition innerhalb der bounds der linie ist?
Tip: benutze java.awt.geom.Line2D
 

gpxricky

Mitglied
Danke für den Tipp Roar, aber die Lösung für das Problem ist ziemlich einfach:

Man muss nur die Methode JComponent.contains(int x, int y) so überschreiben, dass sie true zurück gibt, wenn die Maus über der Komponente sein soll und andernfalls false ausspuckt.

Hier mal ein Beispiel, für alle die vor dem gleichen Problem stehen (habe als interne Variable in meiner Klasse line vom Type Line2D.Double):

Code:
  public boolean contains(int x, int y) {
    // Überprüft, ob sich die Maus unter einem bestimmten Abstand zur Linie
    // befindet
    return (this.line.ptLineDist(x, y) < 2.0f);
  }

Grüßle

gpxricky
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
boscho87 JavaFX Variabeln an neue Scene übergeben AWT, Swing, JavaFX & SWT 0
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
Birke Swing Neue Swing LayoutManager: TOnion Projekt AWT, Swing, JavaFX & SWT 10
J JavaFX Variable an neue Scene übergeben AWT, Swing, JavaFX & SWT 8
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
S Oracle's neue Sicherheitseinstellungen zerstoeren mein Applet. Was tun? AWT, Swing, JavaFX & SWT 3
P Neue Datei erstellen in JPanel AWT, Swing, JavaFX & SWT 5
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
C Neue Benutzeroberfläche einfügen? AWT, Swing, JavaFX & SWT 12
C Swing Fensterresize durch doppelklick - wie die neue Grösse erhalten? AWT, Swing, JavaFX & SWT 3
E JFreeChart in einer dynamischen Aufzeichnung neue Serien hinzufügen? AWT, Swing, JavaFX & SWT 7
K Buttons und neue Fenster AWT, Swing, JavaFX & SWT 9
V Swing Neue Größe bei ComponentListener noch nicht verfügbar? AWT, Swing, JavaFX & SWT 3
Meldanor Swing JTable - Eine neue Zeile vor einer bestehenden Einfügen AWT, Swing, JavaFX & SWT 2
P 2D-Grafik Neue Farbe für einen Teilbereich einer Linie? AWT, Swing, JavaFX & SWT 8
C Swing JLabels entfernen und neue einfügen AWT, Swing, JavaFX & SWT 6
J Swing JList: Neue Zeilen mit fireIntervalAdded sind automatisch selektiert AWT, Swing, JavaFX & SWT 2
C AWT Über Pulldownmenü neue Javadatei öffnen AWT, Swing, JavaFX & SWT 7
E In JTable neue Zeile mit Tabulator einfügen AWT, Swing, JavaFX & SWT 5
G Swing JFileChooser Event für neue Directory? AWT, Swing, JavaFX & SWT 5
M Main Frame schließen und neue Klasse aufrufen? AWT, Swing, JavaFX & SWT 2
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
S [Swing] Wie zeichne ich neue Linien AWT, Swing, JavaFX & SWT 3
R Innerhalb der GUI Klasse meine neue Klasse aufrufen AWT, Swing, JavaFX & SWT 1
4 Neue Fensterinhalte kommen nicht im selben Fenster AWT, Swing, JavaFX & SWT 5
D JLabel o.a. im Swing Fenster löschen um neue JL. zu zeigen AWT, Swing, JavaFX & SWT 4
R JFileChooser (neue Instanzen bei Mehrfachauswahl?) AWT, Swing, JavaFX & SWT 6
G Oberfläche löschen und neue erstellen AWT, Swing, JavaFX & SWT 4
S int-berechnung des RGB-Wertes ohne neue Instanz? AWT, Swing, JavaFX & SWT 9
S MVC - Neues Frame, neue View, neuer Controller? AWT, Swing, JavaFX & SWT 3
Icewind Jlist zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
Icewind JTable zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
O der neue eclipse 3.1 splash screen AWT, Swing, JavaFX & SWT 3
P JComboBox: Items löschen und neue hinzufügen. AWT, Swing, JavaFX & SWT 3
J JTextArea + neue Zeile AWT, Swing, JavaFX & SWT 9
R JFrame oder Frame für neue GUI? AWT, Swing, JavaFX & SWT 2
H Neue Instanz einer Klasse bei JButton-Klick AWT, Swing, JavaFX & SWT 5
S Neue Zeile in JTable adden AWT, Swing, JavaFX & SWT 3
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben