hab sowas schon mal gemacht. damals ging es darum dem benutzer einen maskeneditor zur verfügung zu stellen, über den er sich seine eingabemaske selbst zusammeklicken kann. die zur verfügung stehenden Components waren damals in einer datenbank bereits vordefiniert. einzige ausnahme war das JLabel, welches der benutzer frei und so oft er wollte platzieren konnte.
der editor, den ich geschrieben hatte, war so designed, daß die Components selektiert werden konnten, was bedeutet, daß sie ein gestricheltes rechteck außen herum gezeichnet bekamen plus ausgefüllte kleine rechtecke an jeder ecke des rahmens und an den mittelpunkten der rahmenlinien. selektieren konnte man mit der maus, ggf. mit gedrückter STRG-taste und mittels aufziehen eines rechtecks durch gedrückte maustaste. ausserdem konnte man die Components editieren, sprich, es gab ein popup-menü mit unter anderem einem punkt "eigenschaften". dieser öffnete einen dialog in dem die gemeinsamen eigenschaften aller selektierter Components zusammengefasst wurden. sofern diese dann den gleichen wert hatten, wurde dieser angezeigt, ansonsten gab es eine anzeige eines zwischenzustands (z.b. eine JCheckBox-erweiterung, die als wert nicht nur true und false zulässt, sondern auch beides, also beispielsweise ein graues rechteck über die deseletierte JCheckBox zeichnet.
das ganze war bei mir allerdings kein JLayeredPane sondern einfach nur ein JPanel, was aber aufs gleich rausläuft. zunächst mal hab ich meine zeichenoberfläche von JPanel, also bei dir von JLayeredPane erben lassen und überschrieb die paint(Graphics)-methode. darin rief ich zunächst super.paint(Graphics) auf, damit die oberfläche mitsamt aller Components gezeichnet wird. anschließend führte ich dann noch die eigenen zeichenoperationen aus, wie beispielsweise alle selektierten Components zu umrahmen. dafür habe ich mir ein model gemacht, in welchem ich mir die selektionszustände der Components gemerkt hatte. wird eine neue Component hinzugefügt, so fügte ich sie der oberfläche und dem model hinzu und rief anschließend repaint() von der oberfläche auf. um den rahmen für gruppenselektionen zu zeichnen hatte ich das model um ein Rectangle erweitert. ist dieses null, so gibt es gerade keinen rahmen. ein auf die oberfläche eingetragener MouseListener und MouseMotionListener steuerte diese zeichenoperation. sprich, wenn die maustaste gedrückt wird, überprüft er, ob das über einer Component passiert. ist diese nicht selektiert, so setzt er den zustand im model für diese Component auf seletiert bzw. umgekehrt. wird die maustaste über einer freien oberfläche gedrückt, erzeugt mir der controller ein neues Rectangle und gibt dieses dem model (und ruft anschließend repaint() auf). solange nun die maus nur bewegt wird, verändert sich die größe dieses Rectangles entsprechend mit. soweit ich mich erinnere, kann ein Rectangle auch negative breite und höhe haben, ohne zu murren, nur für den fall, daß der user mit der maus unsinnige dinge tut. die klasse Rectangle bietet mit ihren methoden contains(...) und intersects(...) alles um zu überprüfen ob ein Component auf der oberfläche mit seinen Bounds selektiert werden muss oder nicht. wenn nun ein rechtsklick erfolg kam wie gesagt ein popup-menü mit den punkten "ausschneiden", "kopieren", "löschen", "einfügen", "eigenschaften". weiß nicht mehr genau, wie ich das gelöst hatte. kann sein, daß ich dafür ein extra model geschrieben hab. aber da du eh drag 'n' drop schon realisiert hast, sollte das nicht das problem sein, denn du kannst das mit dem kopieren und einfügen ja auch über die zwischenablage von windows realisieren. wenn die eigenschaften aufgerufen wurden, überprüfte ich in meinem model, welche Components gerade selektiert sind und ließ mir für diese eine anzeige generieren. die anzeige war ein JDialog, auf welchem für die verschiedenen eigenschaften verschiedene zeilen eingefügt wurden. dazu hatte ich mir extra zurechtgelegt, welche eigenschaften eigentlich editierbar sein sollen und wie diese anzuzeigen sind (und dann, glaub ich, für jede eigenschaft eine anzeige geschrieben). soweit ich mich erinnere waren die sinnvollerweise editierbaren eigenschaften schriftart, -größe, -farbe, hintergrundfarbe und rahmen (eigenschaftsanzeige kann hier eine JComboBox sein, die einen eigenen ListCellRenderer erhält, welcher einfach nur JLabel mit ein paar leerzeichen füllt und eine entsprechende Border außenherum legt). nachdem ich die zu editierenden Components also ermittelt hatte, überprüfte ich, welcher klasse diese angehören und von dem her, welche eigenschaften sie besitzten und auf welche werte diese eigenschaften gesetzt sind. dazu machte ich mir eine liste aller möglichen eigenschaften und eine ebensogroße liste der werte. wenn ein JLabel selektiert war, gab es beispielsweise noch die eigenschaft ob der hintergrund sichtbar oder unsichtbar sein soll. entsprechend wurde dann auch die eigenschaft für die hintergrundfarbe ausgeblendet. ausserdem haben in meinem editor JLabel keinen rahmen gehabt. befand sich in der selektion ein JLabel so wurde also die eigenschaft rahmen in der zweiten liste mit dem wert "invisible" versehen. waren hingegen nur JTextField, JButton, JComboBox und JCheckBox selektiert, wurde diese eigenschaft unter den selektierten Components verglichen. hatten alle selektieren Components den selben rahmentyp, wurde dieser entsprechend in der zweiten liste vermerkt, ansonsten wurde dort "unknown" reingeschrieben. genau so wurde mit den anderen eigenschaften verfahren. anschließend wurden beide listen an den konstruktor des JDialog übergeben (an den kontruktor meiner klasse, welche von JDialog erbte), die dann daraus die anzuzeigenden eigenschaftsanzeigen mitsamt deren labels erzeugte.
ich hoffe, ich konnte dir etwas weiterhelfen und dich auf den rechten weg zu einer vernünftigen lösung führen :wink:
viel erfolg
wayne