在java中,如何将一个JPanel添加到另一个JPanel
我希望添加3个JPanel,它们的间隔不同,填充内容窗格/JFrame。 当前,add(new JPanel())将覆盖当前内容窗格或根本不显示 理想情况下,我希望代码类似(例如: 等等 我知道可以将面板添加到面板中,因为我使用了borderlayout。 请不要告诉我使用布局管理器,我一直在使用gridbag,但它没有产生我想要的结果 我想完全控制我的对象的大小和位置。还有,请不要告诉我,“你很蠢;这很蠢;你为什么要这么做?”在java中,如何将一个JPanel添加到另一个JPanel,java,swing,user-interface,jpanel,Java,Swing,User Interface,Jpanel,我希望添加3个JPanel,它们的间隔不同,填充内容窗格/JFrame。 当前,add(new JPanel())将覆盖当前内容窗格或根本不显示 理想情况下,我希望代码类似(例如: 等等 我知道可以将面板添加到面板中,因为我使用了borderlayout。 请不要告诉我使用布局管理器,我一直在使用gridbag,但它没有产生我想要的结果 我想完全控制我的对象的大小和位置。还有,请不要告诉我,“你很蠢;这很蠢;你为什么要这么做?” 只有有用的回答请!我不是一个noob程序员,只是一个对GUI感到失
只有有用的回答请!我不是一个noob程序员,只是一个对GUI感到失望的家伙,所以请随意深入到您想要的深度。JFrame的内容窗格默认使用BorderLayout,因此每次添加新面板时,如果不指定其在布局中的位置,它都会将其添加到中心,从而替换以前的面板
只需将内容窗格的布局设置为所需。当然,您可以使用空布局(即,将布局设置为
null
),但您可能会被这个设计错误所困扰。仅仅因为你不能使用布局管理器并不意味着你不应该这样做。继续学习。GridBagLayout是最复杂的布局之一。你可以先用其他的。有一个很好的教程可以帮助你。它提出的最重要的建议是使用IDE,如,但也包括手工操作
请注意,如果找不到适合您的默认LayoutManager,您可以随时编写自己的LayoutManager—尽管在本例中,这听起来像是您需要的—请参阅
我希望添加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 );
鉴于您发现这样的布局代码令人困惑,我建议您确实不了解如何使用布局管理器。和其他人一样,我建议你花点时间去理解如何利用布局管理器为你带来好处
顺便说一下,使用空布局并不会让您的生活变得更轻松。当然,您可以将组件精确地放置在您想要的位置,但是您是否满足面板占用内容窗格全部空间的要求?您将无法使用框架的pack()方法,因为当您使用空布局时,“主”面板将没有首选大小,因此当您使框架可见时,您将看到的只是标题栏和边框。如果您手动尝试设置框架的大小,则您知道3个面板(300,x 100)的大小,但不知道标题栏和边框的大小。因此,您将无法正确计算大小
了解布局管理器可能需要几分钟的时间,但这是非常值得的。布局管理器将允许您完全控制组件的放置和大小,您只需找到一个对应用程序足够简单的布局管理器,同时为您提供所需的控制量。不使用布局管理器是可能的,但我绝不会建议使用这种编写GUI代码的方法,您最终将管理过多的GUI内容,这些内容通常由
LayoutManager
正确管理(例如可用空间管理、父窗口调整大小…)
大多数LayoutManager
类的工作方式相同;将组件添加到容器
时,还可以指定一个约束,该约束将告诉布局管理器
放置组件的位置,以及如何处理对组件放置有影响的所有类型的事件(例如调整容器大小)。一些布局管理器具有非常简单的约束(BorderLayout
仅要求组件位置),而另一些布局管理器具有非常完整的约束集(gridbagloayout
,通过GridBagConstraints
类)
我喜欢的LayoutManager
是GridBagLayout
()。正确使用gridbagcontaints
类时,可以指定小部件的显示位置、每个组件之间的间距、可用空间的分布方式等。。这将帮助您开始使用此布局管理器
如果这个不适合您的需要,或者您觉得它太复杂,您应该在web上搜索其他
LayoutManager
使用布局管理器的教程。如果一个不做你想做的,那么就用另一个。如果它们都不是你想要的,那么就学习如何详细地使用它们,因为布局管理器是设置布局的唯一方法(嗯……这就是为什么它们被称为“布局”管理器)@xappymah严格来说不是真的,但这是推荐的做事方法——即使这意味着要编写自定义布局管理器。“请不要告诉我…”答案显而易见——告诉我我想听什么。毕竟,我要为这个服务台支持合同买单。(问题是,你既不付钱也不在服务台。)
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 );