Frage

Um es einfach ausgedrückt, ist es eine einfache Java-Swing-Anwendung, die mit einigen Komponenten darin von JFrame besteht. Eine der Komponenten ist ein JPanel, die von einem anderen JPanel auf Benutzeraktion ersetzt werden sollen.

Also, was ist der richtige Weg, so etwas zu tun? Ich habe versucht,

panel = new CustomJPanelWithComponentsOnIt();
parentFrameJPanelBelongsTo.pack();

, aber das wird nicht funktionieren. Was würden Sie vorschlagen?

War es hilfreich?

Lösung

Ihre Nutzung Fall scheint perfekt für Cardlayout .

Kartenlayout Sie mehrere Platten im selben Ort hinzufügen können, aber dann ein- oder ausblenden, eine Platte zu einem Zeitpunkt.

Andere Tipps

1) Einstellen des ersten Panel:

JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());

2) Austausch der Platte:

frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());

Beachten Sie auch, dass Sie dies in der Veranstaltung Thema tun müssen, kommt die SwingUtilities.invokeLater oder die Swingworker

frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.

Denken Sie daran, Java verwenden ‚Kopiervorlage von Wert‘ Argument. So Wechsel zu anderen Methoden eine Variable wird nicht ändern Kopien der Referenz übergeben.

Beachten Sie auch JFrame im Namen der Benutzerfreundlichkeit sehr verwirrend ist. Hinzufügen einer Komponente oder Einstellung eines Layouts (in der Regel) die Operation auf dem Inhaltsfenster. Merkwürdigerweise wirklich das Layout bekommen Sie nicht geben den Layout-Manager des Rahmens.

Hoffen, dass dieses Stück Code gibt Ihnen eine Vorstellung von JPanels in einem JFrame zu ändern.

public class PanelTest extends JFrame {

        Container contentPane;

        public PanelTest()  {
           super("Changing JPanel inside a JFrame");
           contentPane=getContentPane();
        }

        public void createChangePanel() {
           contentPane.removeAll();
           JPanel newPanel=new JPanel();
           contentPane.add(newPanel);
           System.out.println("new panel created");//for debugging purposes
           validate();
           setVisible(true);
        }
}

Auf der Benutzeraktion:

// Sie zu tun haben, etwas entlang der Linien von

myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()

myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()

Dann können Sie Ihre wndow die Größe je nach Bedarf.

Es hängt alles davon ab, wie seine verwendet werden würde. Wenn Sie hin und her zwischen diesen beiden Platten wechseln wollen dann ein Cardlayout verwenden. Wenn Sie nur von der ersten in die zweite einmal Schalt und (und nicht zurück), dann würde ich Telcontar s Vorschlag und ersetzen sie es einfach. Obwohl, wenn die JPanel nicht das einzige, was in Ihrem Rahmen ist, würde ich entfernen (Java .awt.Component) statt removeAll.

Wenn Sie irgendwo zwischen diesen beiden Fällen seines im Grunde ein Raum-Zeit-Kompromiss sind. Das Cardlayout spart Ihnen Zeit aber mehr Speicherplatz einnehmen, indem er jederzeit diese ganze andere Platte im Speicher zu halten. Aber wenn Sie nur das Panel ersetzen bei Bedarf und bauen es auf Anfrage, Sie müssen nicht, dass meory halten um, aber es braucht mehr Zeit zu wechseln.

Sie können auch eine JTabbedPane versuchen Tabs zu verwenden, anstatt (sein noch einfacher als Cardlayout, weil es die Vorführung Griff / Ausblenden automitically)

Die anderen Personen beantwortet die Anfrage. Ich möchte Ihnen einen JTabbedPane vorschlagen anstelle Inhalt zu ersetzen. Als allgemeine Regel ist es schlechte visuelle Elemente Ihrer Anwendung zu haben verschwinden oder durch andere Inhalte ersetzt werden. Sicherlich gibt es Ausnahmen zu jeder Regel, und nur Sie und Ihre Benutzer können den besten Ansatz entscheiden.

Problem :. Meine Komponente nicht angezeigt, nachdem ich es in den Behälter gegeben habe

Sie müssen aufrufen revalidate und repaint nach dem Hinzufügen eine Komponente , bevor sie angezeigt werden in Ihrem Container.

Quelle: http://docs.oracle.com/javase/ tutorial / uiswing / layout / problems.html

Ich habe genau das gleiche Problem !! Increadible !! Die Lösung, die ich fand, war:

  1. die alle Komponenten hinzufügen (JPanels) zu dem Behälter;
  2. Verwenden der setVisible (false) -Methode, um alle von ihnen;
  3. Ein Benutzeraktion, das Setzen von setVisible (true) an der Platte wollte ich zeigen.
// Hiding all components (JPanels) added to a container (ex: another JPanel)
for (Component component : this.container.getComponents()) {
      component.setVisible(false);
}
// Showing only the selected JPanel, the one user wants to see
panel.setVisible(true);

Nein revalidate (), keine validate (), kein Cardlayout benötigt.

Die layout.replace () nur beantworten, existiert / auf dem Grouplayout Manager arbeitet.

Andere LayoutManagers (Cardlayout, BoxLayout usw.) unterstützen diese Funktion nicht, sondern benötigen Sie zuerst RemoveLayoutComponent (und dann AddLayoutComponent (wieder. :-) [Nur die Sache richtig Einstellung]

Ich schlage vor, Sie beide Panel bei Frame Creation hinzufügen, dann das sichtbare Panel ändern setVisible unter der Rufnummer (true / false) auf beiden. Wenn setVisible Aufruf wird die Eltern benachrichtigt und gebeten, sich neu zu streichen.

class Frame1 extends javax.swing.JFrame {

    remove(previouspanel); //or getContentPane().removeAll();

    add(newpanel); //or setContentPane(newpanel);

    invalidate(); validate(); // or ((JComponent) getContentPane()).revalidate();

    repaint(); //DO NOT FORGET REPAINT

}

Manchmal kann man die Arbeit machen, ohne die Revalidierung mit und manchmal ohne die repaint.My advise Verwendung mit beiden.

Rufen Sie die Methode pack () , nachdem die ContentPane Einstellung (java 1.7, vielleicht älter) wie folgt aus:

JFrame frame = new JFrame();  
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
....
frame.setContentPane(panel1);
frame.pack();
...

frame.setContentPane(panel2);
frame.pack();
...

Sie können das ersetzen Methode eines Layouts verwenden:

layout.replace(existingComponent, newComponent)

die bestehenden und neuen Komponenten können JPanels sein, auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top