Mauslistener für transparenten Bereich deaktivieren?

Kai008

Erfahrenes Mitglied
Ich habe Titles in Isometrischer Sichtweiße. Dadurch, dass die JLabels rechteckig sind, überlappen sie, dadurch reagieren die falschen Panels. Mir fällt kein Weg ein, wie man das lösen könnte, die Pixelfarbe mit BufferedImage.getRGB() zu prüfen geht nicht .
 

Anhänge

  • Neu Bitmap (2).PNG
    Neu Bitmap (2).PNG
    3,3 KB · Aufrufe: 19
Hallo,

ich weiß zwar nicht ob es funktioniert, aber ich würde es über die Mausposition versuchen.

Ich schließe mal aus deiner Frage, daß du je ein JLabel mit einem Icon, welches eine Raute darstellt, versehen hast und dieses JLabel in ein Panel gesetzt hast. Dann hast du mehrere dieser Panels so angeordnet, das die Rauten eine geschlossene Fläche bilden.

Da du die Abmessungen der Raute, des JLabels und des Panels kennst, mußt du, wenn ein Panel angeklickt wird, nur feststellen, ob sich die Mausposition innerhalb der Raute befand, oder außerhalb.
Die Position der Raute mußt du mathematisch abgrenzen. (Du mußt also berechnen, ob sich die Mauskoordinaten innerhalb der Raute befinden oder nicht). So kannst du auch feststellen, in welche Ecke des Panels geklickt wurde, wenn nicht auf die Raute geklickt wurde und somit feststellen, daß ein anderes Panel ausgewählt werden sollte.

Du kannst dieses Prinzip natürlich statt auf ein einzelnes Panel auch auf das Objekt beziehen, in das du alle Panels gepackt hast. Durch die Mausposition im Objekt kannst du festlegen, welches Panel ausgewählt werden soll. Du mußt dafür eine Matrix erstellen, die der Mausposition das entsprechende Panel zuordnet.

Wie gesagt, das ist jetzt nur mal so ein Gedankenspiel.

MfG
hansmueller
 
Hiho,

also wenn ich dich richtig verstanden habe sieht dein Problem etwa so aus (siehe Anhang1). Du hast einzelne Labels (linke Abbildung), du du wie rechts abgebildet aneinander reihst. Dadurch ergeben sich Überschneidungen (rote Fläche).

Ich hätte eine Idee um anders an die Sache heranzugehen, allerdings muss ich dazu sagen, dass ich nicht weiß, wie gut diese umsetzbar ist...
Was wäre, wenn du nicht nur das eine Kästchen auf deinem Label hättest, sondern auch die Eckfelder ausmalen würdest. Du hättest dann ein Kästchen wie im Anhang2 dargestellt. Dabei ist die Fläche in der Mitte komplett und die schraffierten Flächen sind nur 25% eines einzelnen Kästchens. Jedem Label fügst du dann den entsprechenden Listener zu und überprüfst bei Aktivierung an welcher Stelle in Bezug auf das Label geklickt wurde. Dadurch kannst du herausfinden, ob es das Kästchen oder das im NO SO SW oder NW betrifft und reagierst dementsprechend darauf.
Die Vorteile hier wären: Keine Überschneidungen, weniger Labels.
Nachteilig ist sicherlich, dass zur Bearbeitung ein wenig Code mehr benötigt wird.
 

Anhänge

  • 24022010_134113.jpg
    24022010_134113.jpg
    13,9 KB · Aufrufe: 15
  • 24022010_134156.jpg
    24022010_134156.jpg
    7 KB · Aufrufe: 11
Danke, das wird auch die einzige Möglichkeit sein.
Gibt es dafür eine allgemeine Formel, um festzustellen, ob der Pixel zum Körper oder bereits zum Nachbarskörper gehört?

Bei dem Anhang ist ja eigendlich der einzige Unterschied, dass die Bereiche nicht transparent sondern aus den Nachtbarn bestehende, oder?
 
Also ja, in meiner Möglichkeit gibt es keine transparenten Flächen. Ungefähr jede 2. Fläche ist komplett, jede andere Fläche wiederum besteht aus 4 Teilen, die verschiedenen Labels zugeordnet sind. Auf welchens Label geklickt wurde kannst du anhand des Listeners überprüfen. Dafür musst du EINEN Listener zu jedem Label zuordnen und bei Aktivierung die Quelle (Ursache) für die Aktivierung des Listeners suchen. So hast du schon die erste Eingrenzung, welches Feld es betrifft. Es kann dann nur noch das Feld im NO NW SW SO oder das auf dem Label sein. Welches von den 5 es dann ist muss anhand des Mausposition auf dem Label ermittelt werden. Dies müsste anhand von trigonometrischen Funktionen möglich sein.

Beispiel:

Java:
class ListenerTest implements MouseListener {
...
label1.addMouseListener(this);
label2.addMouseListener(this);
...
public void mousePressed(MouseEvent me) {
 ...
 if(me.getSource()==label1) {...}
 if(me.getSource()==label2) {...}
 ...
}
...
}
 
Hallo nochmal,

ich hab nochmal drüber nachgedacht und der Begriff trigonometische Funktionen war vielleicht nicht ganz so passend für meine Lösungsgedanken.

Ich werfe hier mal den Begriff Geradengleichung in den Raum. Denk mal drüber nach, wenn du zu keinem genaueren ansatz kommst, kann ich dir ja noch ein paar Denkanschübe geben ;)
 
Danke. OK, ich melde mich bei dir, wenn ich nicht weiterkomme. Aber ich muss sowieso geometrische Funktionen üben, da hinkt es bei mir ganz schön. (Falls ich die Lösung nicht gerade auswendig weiß, wie z. B. Objekt zu anderen Objekt = sinus/cosinus von atan zu x/y addieren/subtrahieren oder Distanze dazwischen = Math.sqrt(a² + b²).)
 
Zurück