在java中,如何将JPanel添加到另一个JPanel

时间:2011-10-22 10:06:09

标签: java swing user-interface jpanel

我希望添加3个JPanel,它们间隔不同的距离,填充内容窗格/ 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感到沮丧的人,所以请随意深入了解你想要的深度。

4 个答案:

答案 0 :(得分:2)

默认情况下,JFrame的内容窗格使用BorderLayout,因此每次向其添加新面板时,如果不在布局中指定其位置,则会将其添加到中心,从而替换前一个。

只需将内容窗格的布局设置为您想要的内容即可。您当然可以使用null布局(即将布局设置为null),但有时您会被这个设计错误所困扰。仅仅因为你无法使用布局管理器并不意味着你不应该这样做。继续学习。 GridBagLayout是最复杂的一个。你可以先使用其他的。

答案 1 :(得分:1)

Doing Without a Layout Manager有一个很好的教程可以帮到你。它最重要的建议是使用诸如NetBeans之类的IDE,但它也包括手工操作。

请注意,如果您找不到适合您的默认LayoutManager,您可以随时编写自己的版本 - 虽然在这种情况下听起来像JSplitPane就是您所需要的 - 请参阅How to Use Split Panes

答案 2 :(得分:1)

  

我希望添加3个JPanel,它们间隔不同的距离,填充内容窗格/ 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)的大小,但您不知道标题栏和边框的大小。所以你将无法正确计算尺寸。

可能需要几分钟才能理解布局管理器,但这非常值得。

答案 3 :(得分:0)

布局管理器将允许您完全控制组件的位置和大小,您只需找到一个足够简单的应用程序,同时为您提供所需的控制量。没有布局管理器是可能的,但是我绝不会建议这样编写GUI代码的方法,你最终会管理太多的GUI内容,这些内容通常由LayoutManager正确管理(例如可用空间管理,父窗口调整大小..)。

大多数LayoutManager类的工作方式相同;将组件添加到Container时,还要指定一个约束,该约束将告诉LayoutManager放置组件的位置,以及如何处理对组件放置有影响的所有类型的事件(例如调整容器大小)。一些布局管理器具有非常简单的约束(BorderLayout仅询问组件位置),而其他布局管理器具有非常完整的约束集(GridBagLayout,通过GridBagConstraints类)

我更喜欢的LayoutManagerGridBagLayoutJavaDoc)。正确使用GridBagContraints类时,您可以指定窗口小部件的显示位置,每个组件之间的间距,可用空间的分布情况等等。此tutorial应该可以帮助您入门使用此布局管理器。

如果这个不适合您的需求,或者您觉得它太复杂,您应该在网上搜索其他LayoutManager的教程。