5 Stimmen

Die Verwirrung im JPanel-Inhaltsbereich

Ich lerne gerade Java Swing und habe eine Menüleiste an den Rahmen angehängt. Standardmäßig sollte dieser Aufruf jframe.getContentPane().add(child) . Als ich das Skript ausgeführt habe, wurde die Menüleiste nicht angezeigt. Aber die Schaltfläche war ganz oben "y=0", wenn das Sinn macht.

Dann bemerkte ich meinen Fehler, dass ich tatsächlich ein Menü in die Menüleiste einfügen musste. Dann tauchte die menuBar auf. Das brachte mich zum Nachdenken... ist die "menubar" "contentpane" eigentlich 2 Panels? Das verwirrt mich jetzt doch sehr. Denn das hat sich sehr wie ein Panel verhalten. Aber getContentPane() gibt einen Container, nicht ein JPanel-Objekt zurück, so dass ich verwirrt bin.

Wenn ja, bedeutet das, dass die einzige Sache, die direkt in einen Rahmen gedumpt wird sind nur Jpanel Objekte? Daher JButtons, JLabels sind nicht direkt in einem Frame... Bedeutet das, dass Jpanels "verschachtelt" sind? Eine weitere Sache, die mich verwirrt. Wenn ein jpanel kontrollieren kann, wie Dinge positioniert werden, wozu ist dann ein LayoutManager da :S Danke, und bitte antworten Sie, als ob ein 2 Jahre altes Kind fragt, warum der Himmel blau ist, ha ;)

10voto

Hovercraft Full Of Eels Punkte 280443

Einige zufällige Gedanken:

  • Ja, JPanels und andere Komponenten sind oft "verschachtelt". Hier ist ein gutes Verständnis der Swing/AWT-Layout-Manager unerlässlich.
  • Während der Typ, der von der JFrame-Funktion getContentPane() technisch gesehen ein Container ist, ist es auch ein JPanel (das schließlich von Container erbt).
  • Ich glaube, dass Sie alles machen können, was von Container the contentPane abgeleitet ist, aber Sie müssen darauf achten, dass es undurchsichtig ist.

3voto

mKorbel Punkte 109073

Dafür gibt es eine Methode

frame.setJMenuBar(menuBar);

für die heutige Java Swing GUI, ist nicht notwendig, erklären ContentPane von Java5, und mit BorderLayout als Standard LayoutManager

entonces frame.add(myPanel); //ist dasselbe wie frame.add(myPanel, BorderLayout.CENTER) und besetzten ganze Container

Grundlegende Informationen über die Verwendung LayourManagers

1voto

Laf Punkte 7725

getContentPane() gibt immer eine Container Instanz. Sie sollten jedoch beachten, dass JPanel Objekte sind Container Instanzen, sowie andere Klassen im Swing-Framework. Die tatsächliche Klasse der zurückgegebenen Instanz ist irrelevant, da Sie keine Kontrolle darüber haben, welche Implementierung von Container als contentPane verwendet wird (es sei denn, Sie haben ein bestimmtes contentPane erzwungen), und in den meisten Fällen sollte dies kein Problem darstellen.

Sie können viele GUI-Widgets in einer JFrame , wie zum Beispiel JButton , JLabel , usw. Sie werden jedoch automatisch dem zugehörigen Inhaltsbereich hinzugefügt.

JPanel nicht mit der Positionierung der Objekte umgeht, wird die LayoutManager die mit Ihrem Panel verbunden sind, entweder automatisch auf der Grundlage seiner eigenen Regeln (z. B. FlowLayout ), oder indem Sie die Einschränkungen verwenden, die Sie beim Hinzufügen des Objekts zum Container angegeben haben (die GridBagLayout Layout-Manager ist ein gutes Beispiel). Die JavaDoc zu den LayoutManagern enthält in der Regel genügend Informationen, um mit deren Verwendung zu beginnen.

Sie können verschachtelte Panels haben, ja. A Container können andere enthalten Container Instanzen. Auch wenn dies eine komplizierte Lösung zu sein scheint, können Sie damit doch genau steuern, wie Ihre grafische Benutzeroberfläche angezeigt wird. Je nachdem, welche LayoutManager je nach den Anforderungen, die Sie mit Ihrer Benutzeroberfläche erfüllen müssen, und Ihren eigenen Vorlieben/Gewohnheiten als Entwickler, benötigen Sie vielleicht weniger oder mehr verschachtelte Panels.

0voto

Bhesh Gurung Punkte 49812

Das müssen Sie sehen API-Dokument para JComponent .

Wenn Sie sich die Vererbungshierarchie ansehen, werden Sie feststellen, dass die JComponent erweitert Component eine JComponent ist also eine Komponente.

Auch unter Direkt bekannte Unterklassen können Sie die Liste aller Klassen sehen, die die Klasse JComponent einschließlich JMenuBar y JPanel .

Also, JMenuBar y JPanel sind zwei speziellere Versionen von JComponent (ou Container ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X