Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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中swing组件的基本问题?_Java_Swing_Layout_Jpanel - Fatal编程技术网

Java中swing组件的基本问题?

Java中swing组件的基本问题?,java,swing,layout,jpanel,Java,Swing,Layout,Jpanel,我的问题是,在理解这个简单的代码方面,它可能是非常基本的。我自己写了这段代码,从这里和那里抓取一些代码来理解。我想一行一行地遵循这个代码,看看每一行的意思是什么? 我将我的理解添加为代码行上方的注释,可能是错误的,或者其中一些标记为***表示我不知道它的意思。如果你能帮我,那就太好了。 谢谢 为了学习Swing,我使用了这本很棒的教程,它介绍了您所拥有的一切,并对其进行了非常深入的解释 本教程还介绍了您在理解时遇到困难的元素 一个Swing顶级容器,包括JFrame、JDialog,由几个组件组

我的问题是,在理解这个简单的代码方面,它可能是非常基本的。我自己写了这段代码,从这里和那里抓取一些代码来理解。我想一行一行地遵循这个代码,看看每一行的意思是什么? 我将我的理解添加为代码行上方的注释,可能是错误的,或者其中一些标记为
***
表示我不知道它的意思。如果你能帮我,那就太好了。 谢谢


为了学习Swing,我使用了这本很棒的教程,它介绍了您所拥有的一切,并对其进行了非常深入的解释

本教程还介绍了您在理解时遇到困难的元素


一个Swing顶级容器,包括JFrame、JDialog,由几个组件组成,所有组件都放在一起,包括一个放在一起的JRootPane、一个JLayeredPane和一个contentPane,后者包含除顶部窗口栏外的大部分GUI。您可以在此处阅读本教程中的详细信息:

因此,当您以默认方式将组件添加到JFrame时,实际上是将其添加到其contentPane中。换言之,这:

myJFrame.add(myComponent);
功能与此相同:

myJFrame.getContentPane().add(myComponent);
要回答这个问题,您需要了解Swing窗口的结构。一个
JFrame
(实际上是任何一个Swing窗口)由一系列组件组成,这些组件生成窗口的视图

(图片来源)

一个
JRootPane
构成了视图的基础,其上是一个
JLayeredPane
和所谓的“玻璃窗格”。
JLayeredPane
负责管理
JMenuBar
和“内容窗格”

内容窗格是组件驻留在窗口上的位置

因此,这一行的意思是,“获取框架的内容窗格,并将其布局设置为使用
边框布局

layouts API本身就是一个完整的问题,您可以使用它来通读更深入的描述,但基本上,布局管理器不需要您关心(一个伟大的交易)不同系统使用的渲染技术的差异

//******
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
这将返回到布局管理器。因为您可以有任意数量的布局管理器,所以Swing允许您在添加组件时向布局管理器传递“约束”,让布局管理器了解您希望如何添加此组件

如果仔细观察,您会发现它有五个可以添加组件的位置

这句话的基本意思是,“请将
myPanel
添加到框架/内容窗格中的
SOUTH
位置”

根据评论更新

如果你看一下这个片段

panelFormat.setLayout(new BorderLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
它将
panelFormat
的布局管理器设置为
BorderLayout
<代码>边框布局在其五个可用位置中的任何一个位置只能有一个组件。当您使用
add(Component)
而不传递布局约束时,
BorderLayout
使用
CENTER
作为默认位置,这意味着您试图将两个组件添加到
CENTER
位置,这是不可能的,因此
BorderLayout
仅使用添加的最后一个组件

为什么borderlayout不固定文本字段的大小而不是拉伸 这都是窗户

因为这就是
BorderLayout
的工作原理,不,
GridLayout
可能会做一些类似的事情

您可以尝试
FlowLayout
GridBagLayout

根据评论更新

您确实需要花时间阅读链接的(和其他建议的)教程…但基本上,您可以像使用任何其他布局一样使用
GridBagLayout
,您可以创建它的实例并将其应用于容器

// create another panel
JPanel panelFormat = new JPanel();
//create a textfield
JTextField txtfield = new JTextField(10);
//create a label for the textfield
JLabel label = new JLabel("Guesss");
//set the layout type for this panel
panelFormat.setLayout(new GridBagLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
//I dont know the difference between the below two
//BorderLayout.CENTER still does not center the panel in the frame, I dont know why
myframe.getContentPane().add(panelFormat, BorderLayout.CENTER);
myframe.add(panelFormat);


哦,漂亮的图片:D+1谢谢,为什么
myframe.getContentPane().add(panelFormat,BorderLayout.CENTER)
此行没有将包含标签和文本字段的面板居中?因为
myPanel
GridLayout
的控制,GridLayout有自己的组件布局概念。上面的一行将确保面板放置在框架的中心位置,使其能够随框架增长和收缩对不起,如果执行此代码,您将注意到标签不可见,文本字段占据整个框架。要压缩它的大小,我必须再次使用GridLayout吗?为什么borderlayout不固定文本字段的大小,而不是将其全部拉伸呢?嗯..我想让标签和文本字段位于框架的中心,并且尺寸较小。因此,使用
BorderLayout.center
是否不可能将两者都放在中间。关于尺寸,我必须使用GridbagLayout吗?谢谢。我将通读这些文件。但你的回答澄清了大部分。现在阅读会更容易:)Swing教程很好地解释了这些概念。您已获得下面的链接。我建议你看一下目录和书签链接,以备将来参考。不仅如此,本教程中的示例还将向您展示通过确保所有代码都在事件调度线程(EDT)上执行来创建GUI的正确方法。通过阅读“并发性”部分,您可以了解有关EDT的更多信息。
panelFormat.setLayout(new BorderLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
// create another panel
JPanel panelFormat = new JPanel();
//create a textfield
JTextField txtfield = new JTextField(10);
//create a label for the textfield
JLabel label = new JLabel("Guesss");
//set the layout type for this panel
panelFormat.setLayout(new GridBagLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
//I dont know the difference between the below two
//BorderLayout.CENTER still does not center the panel in the frame, I dont know why
myframe.getContentPane().add(panelFormat, BorderLayout.CENTER);
myframe.add(panelFormat);