2008-10-04 16 views
10

Ich versuche wieder in Java zu kommen (es ist schon ein paar Jahre her). Ich habe nie wirklich GUI-Programmierung in Java gemacht. Ich benutze Netbeans, um damit anzufangen.Wie füge ich dynamisch Panels zu anderen Panels zur Laufzeit in Java hinzu?

Bei der Verwendung von Winforms in C# bei der Arbeit benutze ich einen usercontrols, um Teile meiner Benutzeroberfläche zu erstellen und sie dynamisch zu Formularen hinzuzufügen.

Ich habe versucht, JPanels wie usercontrols in C# zu verwenden. Ich habe eine JPanel Form namens BlurbEditor erstellt. Dies hat ein paar einfache Kontrollen darauf. Ich versuche, es zur Laufzeit auf einem Schaltflächenereignis zu einem anderen Panel hinzuzufügen. Hier

ist der Code, den ich dachte funktionieren würde:

mainPanel.add(new BlurbEditor()); 
mainPanel.revalidate(); 
//I've also tried all possible combinations of these too 
//mainPanel.repaint(); 
//mainPanel.validate(); 

Dies ist leider nicht funktioniert. Was mache ich falsch?

Antwort

17

Ich habe es herausgefunden. Die Kommentare unter der akzeptierte Antwort hier erklären: Dynamically added JTable not displaying

Im Grunde habe ich nur noch folgendes vor dem mainPanel.add()

mainPanel.setLayout(new java.awt.BorderLayout()); 
-1

Versuchen Sie mainPanel.invalidate() und dann, falls erforderlich, mainPanel.validate(). Es kann auch sinnvoll sein, zu überprüfen, ob Sie dies alles im Ereignisversand-Thread tun, da Ihre Ergebnisse ansonsten nicht korrekt und (im Allgemeinen) nicht deterministisch sind.

+0

Das Hinzufügen des Aufrufs der ungültigen Methode hat nicht geholfen. Ich rufe dies vom Mausklick-Ereignis an, das von Netbeans generiert wurde. – BFreeman

0

Wie bei allen Swing Code, vergessen Sie nicht gui nennen Update innerhalb des Ereignisversand-Threads Siehe this warum Sie Updates wie diese

// Do long running calculations and other stuff outside the event dispatch thread 
while (! finished) 
    calculate(); 
SwingUtilities.invokeLater(new Runnable(){ 
    public void run() { 
    // update gui here 
    } 
} 
5

Swing/AWT Komponenten tun müssen, haben in der Regel ein Layout haben, bevor Sie die Dinge ergänzen - sonst wird die UI nicht wissen, wo die Subkomponenten zu platzieren.

BFreeman hat BorderLayout vorgeschlagen, eine der einfachsten zu verwenden und ermöglicht es Ihnen, Dinge oben, unten, links, rechts oder in der Mitte des übergeordneten Elements zu "kleben".

Es gibt andere wie FlowLayout, die wie eine textarea ist - es fügt Komponenten von links nach rechts an der Spitze des übergeordneten Elements und Wraps auf eine neue Zeile, wenn es bis zum Ende kommt.

Die GridBagLayout, die immer berüchtigt dafür gewesen ist, unmöglich herauszufinden, aber gibt Ihnen fast die ganze Kontrolle, die Sie benötigen würden. Ein bisschen wie diese HTML Tabellen, die wir mit bizarren Kombinationen der Eigenschaften rowspan, colspan, width und height zu sehen pflegten - die nie ganz so aussahen, wie Sie sie haben wollten.

1

mainPanel.add (neuer BlurbEditor());

mainPanel.validate();

HauptPanel.Repaint();

+0

Ich glaube, er hat gesagt, dass er das versucht hat. – durron597

0

ich mit ähnlichem Problem zu tun hatte, wollte ich in einem Panel zur Laufzeit
Nach einigen Tests enthielt das Panel ändern, Neuprüfung und viele meinen pseudo-Algorithmus versagt, ist dies:

parentPanel: enthält die Panel wollen wir
childPanel entfernen: das Layout der parentPanel
editParentLayout(): Panel wir
parentPanelLayout wechseln wollen parentPanel mit verschiedenen childPanel und NEW parentPanelLayout
jedes Mal baut

parentPanel.remove(childPanel); 
editParentLayout(); 
parentPanel.revalidate(); 
parentPanel.repaint(); 
Verwandte Themen