簡體   English   中英

在java中,如何將JPanel添加到另一個JPanel

[英]In java how do you add a JPanel to another JPanel

我希望添加3個JPanel,它們間隔不同的距離,填充Content Pane / JFrame。 目前,add(new JPanel())將覆蓋當前內容窗格或根本不顯示。

理想情況下,我希望代碼類似(例如):

JPanel panel1 = new JPanel();
panel1.add(new jbutton())
panel1.setBounds(0,0,100,100);

JPanel panel2 = new JPanel();
panel2.add(new jbutton());
panel2.setBounds(100,0,100,100);

getContentPane().add(panel1);
getContentPane().add(panel2);

等等...

我知道可以將面板添加到面板中,因為我已經使用borderlayout完成了它。 請不要告訴我使用布局管理器,我一直在使用gridbag,它沒有產生我想要的結果。

我想完全控制對象的大小和位置。 另外,請不要告訴我,“你是愚蠢的;這是愚蠢的;你為什么要這么做?”

只有有用的回復! 我不是一個菜鳥程序員,只是一個對GUI感到沮喪的人,所以請隨意深入了解你想要的深度。

默認情況下,JFrame的內容窗格使用BorderLayout,因此每次向其添加新面板時,如果未在布局中指定其位置,則會將其添加到中心,從而替換前一個面板。

只需將內容窗格的布局設置為您想要的。 你當然可以使用null布局(即將布局設置為null ),但是有時你會被這個設計錯誤所困擾。 僅僅因為你無法使用布局管理器並不意味着你不應該這樣做。 繼續學習。 GridBagLayout是最復雜的一個。 你可以先使用其他的。

有一個關於無需布局管理器的好教程可以幫到你。 它最重要的建議是使用NetBeans之類的IDE,但它也包括手工操作。

請注意,如果找不到適合您的默認LayoutManager,您可以隨時編寫自己的版本 - 盡管在這種情況下聽起來像JSplitPane就是您所需要的 - 請參閱如何使用拆分窗格

我希望添加3個JPanel,它們間隔不同的距離,填充Content Pane / JFrame。

在您的示例中,面板間隔的距離不同。 面板彼此連接。 所以你需要做的就是使用一個FlowLayout面板,它使用水平間隙0。

您的主要代碼可以是:

JPanel main = new JPanel( new FlowLayout(FlowLayout.CENTER, 0, 0) );

JPanel panel1 = new JPanel();
panel1.setPreferredSize( new Dimension(100, 100) );
panel1.add( new JButton() );
main.add( panel1 );

JPanel panel2 = new JPanel();
panel2.setPreferredSize( new Dimension(100, 100) );
panel2.add( new JButton() );
main.add( panel2 );

frame.add( main );

鑒於你發現這樣的布局代碼令人困惑,我建議你真的不明白如何使用布局管理器。 和其他人一樣,我建議您花點時間了解如何使用布局管理器。

順便使用null布局並不會讓你的生活變得更輕松。 當然,您可以將組件准確放置在您想要的位置,但是您是否滿足了面板占據內容窗格的整個空間的要求? 您將無法使用框架的pack()方法,因為當您使用空布局時,“主”面板將沒有首選大小,因此當您使框架可見時,您將看到的所有內容都是標題酒吧和邊界。 如果您手動嘗試設置框架的大小然后是,您知道3個面板(300,x 100)的大小,但您不知道標題欄和邊框的大小。 所以你將無法正確計算尺寸。

可能需要幾分鍾才能理解布局管理器,但這非常值得。

布局管理器將允許您完全控制組件的位置和大小,您只需找到一個足夠簡單的應用程序,同時為您提供所需的控制量。 沒有布局管理器是可能的,但是我永遠不會建議這樣編寫GUI代碼的方法,你最終會管理太多的GUI內容,這些內容通常由LayoutManager正確管理(例如可用空間管理,父窗口調整大小)。 )。

大多數LayoutManager類以相同的方式工作; 將組件添加到Container ,還要指定一個約束,該約束將告訴LayoutManager放置組件的位置,以及如何處理對組件放置有影響的所有類型的事件(例如調整容器大小)。 一些布局管理器具有非常簡單的約束( BorderLayout僅詢問組件位置),而其他布局管理器具有非常完整的約束集( GridBagLayout ,通過GridBagConstraints類)

LayoutManager我更喜歡的是GridBagLayout的JavaDoc )。 正確使用GridBagContraints類時,您可以指定窗口小部件的顯示位置,每個組件之間的間距,可用空間的分布方式等。本教程可幫助您開始使用此布局管理器。

如果這個不適合您的需求,或者您覺得它太復雜,您應該在網上搜索其他LayoutManager教程。

暫無
暫無

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

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