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);