Mehrere Objekte in einem JFrame darstellen

Status
Nicht offen für weitere Antworten.
hallo
ich versuche mein problem einmal ohne code zu erklären, da die lösung des problems wohl eher einfacher natur sein könnte.

ich habe eine klasse Kreis geschrieben, in der ich mit der methode paint(Graphics g) mit g.fillOval() einen kreis zeichnen lasse. in einer anderen klasse, welche ein JFrame erzeugt, erzeuge ich nun kreis1 und kreis2 nach der klasse Kreis. stelle ich nun mit this.getContentPane().add(kreis1) im Fenster dar, klappt das prima. will ich aber beide darstellen, so wird nur der zweite kreis gezeichnet. ich vermute, dass es mit dem layout zu tun hat. als zusatzinformation: schlussendlich sollten die kreise durch eine mausbewegung frei verschiebbar sein, ein gridlayout kommt also nicht in frage.
ich wäre froh um einen hinweis, wie ich dieses problem beheben kann.
sollte die schilderung des problems zu unverständlich sein, kann ich gerne noch code senden.
gruss der gesalbte
 
jesus_heiland hat gesagt.:
schlussendlich sollten die kreise durch eine mausbewegung frei verschiebbar sein
Wie jetzt? Die Kreise sollen verschiebbar sein oder die Panels auf denen die Kreise
gezeichnet werden?

Falls letzteres zutreffen sollte, glaube ich kaum daß es ein derartiges Layout gibt. ???:L

Benutz doch einfach das Null-Layout und realisiere die Verschiebung durch einen
MouseMotionListener für die Panels.

Ich frage mich nur, wozu sowas gut sein soll ???:L
 
schlussendlich ein programm geben, das den strahlengang durch verschiedene brechende körper(prisma,linse etc) anzeigt. deswegen möchte ich die einzelnen kreise oder dann eben auch dreiecke verschieben können. mit dem null-layout wird gar nichts mehr angezeigt, obwohl ja über die methode g.fillOval() die grösse und ort des kreises bestimmt sind. das mit dem MouseMotionListener habe ich schon gemacht, das funktioniert.
 
Ich sehe immer noch nicht, warum du die Panels selbst verschieben willst, ich denke
es reicht vollkommen aus, die Kreise zu verschieben. In dem Fall sind deine Kreise nicht
von JPanel abgeleitet sondern -- wenn es überhaupt eigene Klassen sein müssen -- besitzen
nur die notwendigen Attribute wie Mittelpunkt, Radius, ...?

Die Verschiebung würde ich lösen, indem du dem Einen Panel, daß beide Kreise
besitzt und zeichnet, einen mouseMotion-Listener verpaßt, der anhand der aktuellen
Mauskoordinaten in der mousePressed-Methode bestimmt welchen Kreis
du angeklickt hast (Mittelpunkt, Radius) und in der mouseMoved-Methode die eigentliche
Verschiebung (Änderung des Mittelpunkts relativ zur Differenz aus aktueller Mauskoordinate
und Mauskoordinate beim Anklicken) ausführt und am Ende durch Aufruf von repaint() den
EDT veranlaßt alles neu zu zeichnen.
 
das mit dem MouseMotionListener funktioniert bereits, damit habe ich keine probleme.

ich versuche mein problem nochmals zu schildern:
wenn ich ein objekt der klasse Kreis anzeige klappts wunderbar. will ich zwei objekte der klasse Kreis darstellen, wird nur das zweite gezeichnet. warum das?

dies ist eigentlich meine frage 🙂
 
Das war mir schon klar 😀
Da du die Kreise mit der Methode paint() zeichnest (Bei allen J-Komponenten solltest du
im Übrigen nicht die Methode paint() sondern repaintComponent() überschreiben), heißt
das, Kreis ist von JPane (zumindest einer JComponent) abgeleitet.

Das Default-Layout deines JFrames (genauer ihres Content-Panes) ist BorderLayout.
Jeder add-Aufruf ohne weitere Angabe überschreibt immer die CENTER-Komponente,
darum siehst du am Schluß nur den 2. Kreis. Du könntest beispielsweise deinen einen
Kreis in die WEST und deinen anderen in die EAST-Komponente stecken, ich weiß
aber nicht, ob du das willst.

Da ich (siehe mein 1. Post) jedoch kein anderes Layout kenne, dessen Komponenten
verschiebbar sind, habe ich dir den anderen Vorschlag gemacht.
 
danke für die antwort, habe deinen vorschlag mit dem null-layout mal verwendet. mit dem anzeigen klappt das nun, jetzt muss ich einfach den MouseMotionListener (genauer die methode mouseDragged() so basteln, dass sie in setBounds() die parameter ändert, da ich ja jetzt nicht direkt die koordinaten des kreises beeinflussen kann.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben