Swing Eigene Komponente wird nur halb oder komisch angezeigt

Hutmacher

Bekanntes Mitglied
Ich habe eine abstrakte Klasse Shape, die von JComponent erbt. Diese hat eine Unterklasse Rectangle, die sich dann konkret zeichnet, also wie ein Rechteck beim Malen verhält.Das Ganze als Komponente, damit es auf Rechtsklick etc. reagieren kann.
So eins lasse ich nun in einem JPanel mit Null-Layout anzeigen, was ich widerrum in ein JFrame packe.
Das Rectangle erscheint – so halb –, und wenn ich es anklicke, damit es sich bewegt oder es mit der Maus ziehe, wird es komisch oder gar nicht mehr angezeigt.
Wenn ich anstatt meines Rechteck nun einen JButton nehme, wird dieser komplett angezeigt.
Also werde ich wahrscheinlich in Shape oder Rectangle irgendetwas gemacht haben, was falsch war. Das habe ich nun schon seit 4 Stunden versucht herauszufinden, aber erfolglos.

Deswegen hier mal kurz mein Eclipse-Projekt-Ordner (als kleiner Test abgespalten, nur diese 4 Klassen), TestingFrame hat die Main-Methode (einfach in Eclipse mit New Project → from existing source → Ordner auswählen, oder TestingFrame mit dem Java-Interpreter ausführen).
 

Anhänge

Ein Graphics-Objekt zwischenspeichern und danach (in doMoving) dort reinmalen ist nicht OK. Man darf NUR von der paintComponent aus malen, und NUR in das Graphics-Objekt, das dort übergeben wird. DIe Namen und die Vererbungshierarchie sehen komisch aus (sowohl Shape als auch Rectangle sind Namen, die schon im java AWT package verwendet werden - sei doch mal ein bißchen kreativ 😉 ). Beschreib' vielleicht mal, was du vorhast....
 
Stimmt, ich erinnere mich gerade an das Swing-Tutorial hier als Sticky =)
So rufe ich also nur doMoving() auf (die heißt btw so, weil sie früher move hieß, was es in JComponent schon gab, was mir den ganzen Abend versaut hat) und repainte dann einfach, es wird dann ja nach dem paintComponent-Callback wieder draw aufgerufen, nur diesmal mit anderen Koordinaten.

Das, was ich zu bewerkstelligen versuche, ist dass ich auf dieser Fläche, der DrawingArea, meine Rectangle-Komponente hinsetzen und dann bewegen kann, und dass sie normal angezeigt wird und nicht so komisch; also basically das Verschieben meiner Komponentצe.

Btw, ich finde Shape ud Rectangle sind die treffendsten Namen und da ich die Namen ja (im richtigen Projekt im shapes-Package) qualifizieren kann, ist alles ok; oder hast du n besseren Vorschlag? 🙂
 
Ja, "ich will da klicken und was bewegen" - so weit schon klar. Was soll sowas wie "setMiddledPosition" machen? Was da steht macht einfach keinen Sinn: Die Mausposition ist in bezug auf die Koordinaten vom "Rectangle" gegeben, und setLocation bezieht sich auf die Position des Rectangles IN der DrawingArea. Der MouseListener müßte an der DrawingArea hängen, bei einem Mausklick schauen, welches Rectangle getroffen wurde, und bei einem Drag das Rectangle (MIT den Koordinaten, die in bezug auf die DrawingArea gegeben sind, IN der DrawingArea) neu positionieren. Alternativ dazu könnte der MouseMotionListener am Rectangle hängen, und die Veränderung der Position zwischen zwei MouseEvents verwenden, um die neue Position zu berechnen.
Und die Namen und Gesamtstruktur: Sch***egal, nenn' es "DrawShape" und "DrawRectangle" oder so, aber so ist das konfus. Ein Rechteck von JComponent erben zu lassen ist IMHO auch nicht sinnvoll ... einerseits könnte man sagen: "Ist egal, ist ja nur Rumspielerei", aber wenn das dann bewirkt, dass hier solche Fragen aufauchen, und ein versehentliches Überschreiben der move-Methode zu stundenlangem Debugging führt, sieht man schon ein paar (wenige) der Nachteile...
 

Zurück
Oben