簡體   English   中英

JPanel內容窗格混亂

[英]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歲的老人問為什么天空是藍色的,哈哈;)

一些隨意的想法:

  • 是的,JPanels和其他組件通常是“嵌套”的。 這是對Swing / AWT布局管理者的深刻理解至關重要的地方。
  • 雖然JFrame的getContentPane()返回的類型在技術上是一個Container,但它也是一個JPanel(最終從Container繼承)。
  • 我相信你可以制作任何派生自ContainerPane的東西,但是你需要注意它是不透明的。

因為有方法

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小部件,例如JButtonJLabel等。但是,它們將自動添加到關聯的contentPane中。

JPanel不處理對象定位,與您的面板關聯的LayoutManager做; 或者根據自己的規則集(例如FlowLayout )自動生成,或者使用在將對象添加到容器時指定的約束( GridBagLayout布局管理器就是一個很好的例子)。 LayoutManagers上的JavaDoc通常包含足夠的信息以幫助您開始使用它們。

您可以使用嵌套面板,是的。 Container可以包含其他Container實例。 雖然它似乎是一個復雜的解決方案,但它確實可以讓您精確控制GUI的顯示方式。 根據您使用的LayoutManager您必須使用用戶界面滿足的需求,以及您自己作為開發人員的偏好/習慣,您可能需要更少或更多的嵌套面板。

您需要為JComponent查看此API文檔

如果查看繼承層次結構,您將看到JComponent擴展Component因此JComponent是Component。

同樣在Direct Known Subclasses下 ,您可以看到擴展JComponent的所有類的列表,包括JMenuBarJPanel

因此, JMenuBarJPanelJComponent (或Container )的兩個更專業的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM