我的问题在理解这个简单的代码方面可能非常基础。我自己编写了这段代码,从这里和那里了解一些代码。我想逐行跟踪这段代码,看看每行的含义是什么?
我在代码行之上添加了我的理解作为注释,它可能是错误的,或者其中一些标记为****
意味着我只是不知道它意味着什么。如果你能在这里帮助我,那就太好了。
感谢
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TestingSwingComponents {
public TestingSwingComponents() {
//Create a frame which is the window that pops up
JFrame myframe = new JFrame();
//*****
myframe.getContentPane().setLayout(new BorderLayout());
//set the frame size to be 600 X 600 size
myframe.setSize(600, 600);
// create Pane1
JPanel myPanel = new JPanel();
//set the Layout component of Panel, as how you would like it to be
//here it is 2 rows and 15 columns
myPanel.setLayout(new GridLayout(2, 15));
//create a button with text in it
JButton letterButton = new JButton("click Me");
//add the created button component to the panel
myPanel.add(letterButton);
//******
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
// create another panel
JPanel panelFormat = new JPanel();
//create a textfield
JTextField txtfield = new JTextField();
//create a label for the textfield
JLabel label = new JLabel("Guesss");
//set the layout type for this panel
panelFormat.setLayout(new BorderLayout());
//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);
// default settings
myframe.setTitle("Get buttons");
myframe.setVisible(true);
myframe.setLocationRelativeTo(null);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) throws ParseException {
new TestingSwingComponents();
}
}
答案 0 :(得分:3)
一个Swing顶级容器,包括一个JFrame,JDialog由几个组成的组件组成,包括一个整体保存在一起的JRootPane,一个JLayeredPane和一个contentPane,后者包含除顶部窗口之外的大部分GUI酒吧。您可以在此处详细了解本教程中的详细信息:Top Level Containers:
因此,当您以默认方式将组件添加到JFrame时,实际上是将其添加到其contentPane中。换句话说,这个:
myJFrame.add(myComponent);
在功能上与此相同:
myJFrame.getContentPane().add(myComponent);
答案 1 :(得分:3)
myframe.getContentPane().setLayout(new BorderLayout());
要回答这个问题,您需要了解Swing窗口的结构。 JFrame
(实际上是任何Swing窗口)由一系列组件组成,这些组件生成窗口视图。
(图片来自How to use Root Panes)
JRootPane
组成了视图的基础,其顶部是JLayeredPane
,所谓的“玻璃窗格”。 JLayeredPane
负责管理JMenuBar
和“内容窗格”。
内容窗格是组件驻留在窗口中的位置。
所以,这一行说的是,“获取框架的内容窗格并设置它的布局以使用BorderLayout
”
布局API本身就是一个完整的问题,你可以通过Laying out components within a container阅读更为不同的描述,但基本上,布局管理员无需你去关注(a关于不同系统所使用的渲染技术的差异......
//******
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
这回到了布局管理器。因为您可以拥有任意数量的布局管理器,所以Swing允许您在添加组件时将“约束”传递给布局管理器,从而让布局管理器了解您希望如何添加此组件。
如果仔细查看BorderLayout
,您会看到它有五个位置可以添加组件。
该行基本上是这样说的,“请将myPanel
添加到框架/内容窗格中的SOUTH
位置”
从评论中更新
如果您看一下这个片段......
panelFormat.setLayout(new BorderLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
它将panelFormat
的布局管理器设置为BorderLayout
。 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);
答案 2 :(得分:0)