[英]The JPanel contentpane confusion
我正在學習Java Swing,並在菜幀中添加了一個menuBar。 默認情況下,這應該調用jframe.getContentPane().add(child)
。 當我運行腳本時,menuBar沒有出現。 但是如果有意義的話,按鈕位於最頂部的“y = 0”。
然后我意識到我的錯誤,我實際上必須把菜單放在菜單欄中。 然后menuBar出現了。 這讓我思考......“menubar”“contentpane”實際上是2個面板嗎? 這讓我感到困惑。 因為這很像一個小組。 但getContentPane()
返回一個Container,而不是JPanel對象,所以我很困惑。
如果是這樣,這是否意味着直接轉儲到框架中的唯一東西就是Jpanel對象? 因此,JButtons,JLabel不是直接在框架中...這是否意味着,jpanels是“嵌套的”? 還有一件令我困惑的事情。 如果jpanel可以控制事物的位置,那么LayoutManager是什么用的? :謝謝,請回答好像是2歲的老人問為什么天空是藍色的,哈哈;)
一些隨意的想法:
getContentPane()
返回的類型在技術上是一個Container,但它也是一個JPanel(最終從Container繼承)。 因為有方法
frame.setJMenuBar(menuBar);
對於今天的Java Swing GUI,不需要從Java5聲明ContentPane
,並使用BorderLayout作為默認的LayoutManager
然后是frame.add(myPanel);
//與frame.add(myPanel, BorderLayout.CENTER)
並占用整個Container
關於如何使用LayourManagers的基本知識
getContentPane()
始終返回Container
實例。 但是,您應該注意JPanel
對象是Container
實例,以及Swing框架中的其他類。 返回的實例的實際類是無關緊要的,因為您無法控制將Container
哪個實現用作contentPane(除非您強制使用特定的contentPane),並且大多數情況下這不應該是一個問題。
您可以在JFrame
添加許多GUI小部件,例如JButton
, JLabel
等。但是,它們將自動添加到關聯的contentPane中。
JPanel
不處理對象定位,與您的面板關聯的LayoutManager
做; 或者根據自己的規則集(例如FlowLayout
)自動生成,或者使用在將對象添加到容器時指定的約束( GridBagLayout
布局管理器就是一個很好的例子)。 LayoutManagers上的JavaDoc通常包含足夠的信息以幫助您開始使用它們。
您可以使用嵌套面板,是的。 Container
可以包含其他Container
實例。 雖然它似乎是一個復雜的解決方案,但它確實可以讓您精確控制GUI的顯示方式。 根據您使用的LayoutManager
您必須使用用戶界面滿足的需求,以及您自己作為開發人員的偏好/習慣,您可能需要更少或更多的嵌套面板。
您需要為JComponent
查看此API文檔 。
如果查看繼承層次結構,您將看到JComponent
擴展Component
因此JComponent是Component。
同樣在Direct Known Subclasses下 ,您可以看到擴展JComponent
的所有類的列表,包括JMenuBar
和JPanel
。
因此, JMenuBar
和JPanel
是JComponent
(或Container
)的兩個更專業的版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.