Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何将一个JPanel添加到另一个JPanel_Java_Swing_User Interface_Jpanel - Fatal编程技术网

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

在java中,如何将一个JPanel添加到另一个JPanel,java,swing,user-interface,jpanel,Java,Swing,User Interface,Jpanel,我希望添加3个JPanel,它们的间隔不同,填充内容窗格/JFrame。 当前,add(new JPanel())将覆盖当前内容窗格或根本不显示 理想情况下,我希望代码类似(例如: 等等 我知道可以将面板添加到面板中,因为我使用了borderlayout。 请不要告诉我使用布局管理器,我一直在使用gridbag,但它没有产生我想要的结果 我想完全控制我的对象的大小和位置。还有,请不要告诉我,“你很蠢;这很蠢;你为什么要这么做?” 只有有用的回答请!我不是一个noob程序员,只是一个对GUI感到失

我希望添加3个JPanel,它们的间隔不同,填充内容窗格/JFrame。 当前,add(new JPanel())将覆盖当前内容窗格或根本不显示

理想情况下,我希望代码类似(例如:

等等

我知道可以将面板添加到面板中,因为我使用了borderlayout。 请不要告诉我使用布局管理器,我一直在使用gridbag,但它没有产生我想要的结果

我想完全控制我的对象的大小和位置。还有,请不要告诉我,“你很蠢;这很蠢;你为什么要这么做?”


只有有用的回答请!我不是一个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 );