Java的三层容器结构
Java 包含三层容器结构
- 根容器JFrame ,JDialog, Applet(已经被淘汰)
- 二层容器结构 JPanel,JScrollPane,JSplitPane等等,中间层的容器结构只用于装载第二层容器或者第三层结构,不提供用户交互,被放置在根容器或者二层容器中。
- 三层容器结构就是原子组件,包括JLable,JButton,JcheckBox等可以与用户交互的组件。
下面用一个简单的例子演示一下三层容器结构
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new JFrame("swing frame");//第一层,根容器用JFrame
//获取根容器的内容面板,加入说根容器是
java.awt.Container contentPane = frame.getContentPane();//获取根容器的内容面板
//二层容器设置↑
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.black,5));
panel.setLayout(new GridLayout(2, 1));//设置为二行一列
//三层容器申请
JLabel label = new JLabel("Label1",SwingConstants.CENTER);
JButton button = new JButton("Button");
//三层容器加入到二层面板中
panel.add(label);
panel.add(button);
//二层容器加入到一层面板中
contentPane.add(panel);
//对组件进行排列
frame.pack();
//显示
frame.setVisible(true);
//关闭此Gui即关闭程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
效果
Java布局管理
java包含好几种布局形式,这些布局形式可以让我们在拖动总体布局的时候不会影响到整体的效果,主要有以下几大类
- BorderLayout 东南西北中布局
- FlowLayout
- GridLayout
- CardLayout
- GridBagLayout
- BoxLayout
- SpringLayout
BorderLayout
俗称东南西北中布局
,是JFrame的默认基础布局,可以将布局很容易分配到对应的边缘角上。
示例代码
private static void addContanierToPanel(Container panel) {
if(!(panel.getLayout() instanceof BorderLayout)) {
panel.add(new JLabel("Container doesn't use BorderLayout"));
}
//这里就比较简单了,简单的将原子容器加载然后设置在JFrame的对应位置就可以放置在你想要的位置上
JButton button1 = new JButton("Page_start");
JButton button2 = new JButton("page_end");
JButton button3 = new JButton("Line_start");
JButton button4 = new JButton("line_end");
JButton button5 = new JButton("Center");
panel.add(button1,BorderLayout.PAGE_START);
panel.add(button2,BorderLayout.PAGE_END);
panel.add(button3,BorderLayout.LINE_START);
panel.add(button4,BorderLayout.LINE_END);
panel.add(button5,BorderLayout.CENTER);
}
private static void creatAndShowGui() {
//创建根容器JFrame
JFrame myFrame = new JFrame("BorderLayout Demo");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将根容器的面板引用传入到函数中用于加载原子组件,这样便于管理与更改,要学会这种方式!!!!
addContanierToPanel(myFrame.getContentPane());
myFrame.pack();
myFrame.setVisible(true);
}
public static void main(String[] args) {
//开启一个单独的线程
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
creatAndShowGui();
}
});
}
效果
FlowLayout
像流水线一样,不停在一个控件之后添加一个控件,当这行无法装载的时候开启下一行。
private static void addContanierToPanel(Container panel) {
if(!(panel.getLayout() instanceof BorderLayout)) {
panel.add(new JLabel("Container doesn't use BorderLayout"));
}
//这里就比较简单了,简单的将原子容器加载然后设置在JFrame的对应位置就可以放置在你想要的位置上
panel.setLayout(new FlowLayout());
panel.add(new JButton("Button"));
panel.add(new JButton("Button2"));
panel.add(new JButton("long long long name JButton"));
panel.add(new JButton("small"));
}
private static void creatAndShowGui() {
//创建根容器JFrame
JFrame myFrame = new JFrame("BorderLayout Demo");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将根容器的面板引用传入到函数中用于加载原子组件,这样便于管理与更改,要学会这种方式!!!!
addContanierToPanel(myFrame.getContentPane());
myFrame.pack();
myFrame.setVisible(true);
}
public static void main(String[] args) {
//开启一个单独的线程
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
creatAndShowGui();
}
});
}
效果
GridLayout 网格布局,
用于将界面分为等大的若干块,组件被等大地按照加载的顺序放入其中,也就是我们在表格中一个一个填入控件
这里相较于上一个代码只改动了addContainerPanel
函数,用于设置新的布局与添加原子组件,总的来说还是比较简单的。
private static void addContanierToPanel(Container panel) {
if(!(panel.getLayout() instanceof BorderLayout)) {
panel.add(new JLabel("Container doesn't use BorderLayout"));
}
//这里就比较简单了,简单的将原子容器加载然后设置在JFrame的对应位置就可以放置在你想要的位置上
panel.setLayout(new GridLayout(0, 2));
panel.add(new JButton("Button"));
panel.add(new JButton("Button"));
panel.add(new JButton("Button"));
panel.add(new JButton("Button"));
panel.add(new JButton("Button"));
}