JComponent ersetzen

  • Themenstarter Themenstarter splitshade
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

splitshade

Gast
Hey leute,

sagt mal, gibt es eine Möglichkeit, in einem Swing-Layout eine Komponente komplett durch eine andere zu ersetzen?
Ich habe ein komplexes Layout, jede Komponente hat eine Id, jetzt möchte ich z.B auf einen Button eine Action legen,
die z.B. das Panel mit id "Com1" durch ein neues Panel ersetzt.
Welche Möglichkeiten hab ich?


Gruß

Martin
 
Mit remove die alte Komponente entfernen (d.h. du mußt sie dir merken
(als Instanzvariable)), mit einer passenden add-Variante die neue Komponente
einfügen und schließlich revalidate auf deinem Panel ausführen.
 
Ja soweit klar,

allerdings weiß ich keine passende Add-Methode..
Ein Tipp wäre hilfreich, ich bin mittlerweile soweit, dass ich die passende Komponente finde, und sie
auch entfernen kann, aber ein add() setzt die neue Komponente nicht an die richtige Stelle,
sondern an die nächste freie Stelle des LayoutManagers.

Martin
 
splitshade hat gesagt.:
allerdings weiß ich keine passende Add-Methode.

Die ist abhängig vom Layout daß dein JPanel hat.

Für FlowLayout, GridLayout, ...

genügt ein einfaches add(component),

Bei BorderLayout z.B.

add(component, BorderLayout.CENTER)
 
das setzt das Component aber nicht an die aktuelle Stelle,

im Beispiel FlowLayout(), ich habe 3 Buttons, und möchte den mittleren austauschen,
also entferne ich den mittleren, und möchte anstatt des Buttons nun ein JLabel in die Mitte setzen.
Wenn ich nun panel.add(new JLabel("schöner Text")); ausführe, steht das Label rechts.
Tja, blöd, denn es muß in die Mitte, dieses Beispiel nun um 5000% komplizierter
(im Layout sind momentan ca 300 Komponenten), dann weißt du mein Problem.

Ich bräuchte eine Methode "replaceAt" replaceComponent, addCOmponentAt oder sowas
 
splitshade hat gesagt.:
..Ich bräuchte eine Methode "replaceAt" replaceComponent..
Code:
   private void replaceComponent(JPanel panel, Component a, Component b){
        int i = panel.getComponentZOrder(a);
        panel.add(b);
        panel.setComponentZOrder(b, i);
        panel.remove(a);
    }
 
Ja, die Idee hatte ich auch schon, allerdings funktioniert das wohl nicht im GridBagLayout?
 
splitshade hat gesagt.:
im Beispiel FlowLayout(), ich habe 3 Buttons, und möchte den mittleren austauschen

Wieder mit einem Button?

Wieso änderst du da nicht einfach den Text des Buttons und verpaßt ihm einen
neuen ActionListener (den alten natürlich entfernen). :shock:
 
Na,na, das war nur ein Beispiel, um die Problematik zu verdeutlichen,
das eigentliche Problem ist viel, viel komplizierter und tut auch nichts zur Sache.

Es muss doch eine Möglichkeit geben, das zu machen??
 
Wir arbeiten an einem XML-Layouting System, und dem liegt nun mal leider ein GBL zugrunde :cry:
 
Komisch, hier klappt das nicht

if (((XComponent)comp).getId()!=null && ((XComponent) comp).getId().equals(id)) {

int index=((JComponent)component).getComponentZOrder(comp);
JButton button=new JButton("hit me");
((JComponent)component).add(button);
((JComponent)component).setComponentZOrder(button, index);
((JComponent)component).remove(comp);
((JComponent)component).revalidate();
}

der Button wird falsch eingefügt..

komisch
 
Ok, Trick ist folgender

int index=((JComponent)component).getComponentZOrder(comp);
GridBagConstraints constraint=((GridBagLayout)((JComponent)component).getLayout()).getConstraints(comp);

((JComponent)component).add(newComponent,constraint);

((JComponent)component).remove(comp);
((JComponent)component).revalidate();
((JComponent)component).repaint();

Tja, man muss nur drauf kommen, danke euch!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben