Swing 程序用JFrame 对象实现了它们的窗口。JFrame 类是AWT Frame 类的一个子类。它还加入了一些Swing 所独有的特性。与 Frame 的使用十分相似。唯一的区别在于,你不能将组件加入到JFrame中。你可以或者将组件加入到JFrame 的content pane(内容面板) 中,或者提供一个新的content pane(内容面板)。
面板与顶层容器的不同点:面板不能独立存在,必须被添加到其他容器内部(面板可以嵌套)。
JFrame 有一个 Content Pane的窗口,能显示的所有组件都是添加在这个 Content Pane 中。JFrame 提供了两个方法: getContentPane 和 setContentPane 就是用于获取和设置其 Content Pane 的。
对JFrame添加组件有两种方式:
1)用 getContentPane ()方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent)
2)建立一个Jpanel或JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板:
JPanel contentPane = new JPanel();
……//把其它组件添加到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane对象设置成为frame的内容面板中
一般用第一中方法添加组件。
注意:用setContentPane()方法不允许设置窗体布局,其只显示最后添加的组件,且该组件将布满整个窗口,而不管原先组件的大小设置,相当于只允许添加一次组件作为JFrame的内容面板。所以一般不实用该方法进行添加组件(可能是我不知道吧)。
2、 JPanel的使用
JPanel是Java图形化界面中最常使用的容器。
实例1:在窗体中添加一个蓝色的面板
package frame;
import javax.swing.*;
import java.awt.*; //引入AWT包,因为要使用到颜色类
public class PanelDemo {
public static void main(String[] args) throws Exception {
JFrame f = new JFrame("第一个Java窗口");
f.setSize(300,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setLayout(null); //设置窗体布局为空布局
JPanel p = new JPanel(); //实例化一个面板
//设置面板颜色,如果不引入AWT包,程序将出错
p.setBackground(Color.BLUE);
p.setSize(100,100); //设置面板对象大小
//用getContentPane()方法获得JFrame的内容面板
f.getContentPane().add(p); //将面板加到窗体中
//如果使用下面面板添加方法,面板将布满整个窗口
//f.setContentPane(p);
}
}
中间容器可以嵌套中间容器
实例2:面板的嵌套
package frame;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TwoPanel extends JFrame {
public TwoPanel(String title) {
super(title);
}
public static void main(String[] args) {
TwoPanel tp = new TwoPanel("TWO Panel测试");
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
tp.setLayout(null);
tp.getContentPane().setBackground(Color.green); //设置窗口的颜色
tp.setSize(250, 250);
p1.setLayout(null); //设置面板布局
p1.setSize(150, 150);
p1.setBackground(Color.red);
p2.setBackground(Color.yellow);
p2.setSize(50, 50);
p1.add(p2); //将面板p2添加到p1中
//将pan1添加到窗体中,因为pan2被添加到pan1中,所以pan1、pan2都被显示在窗体中
tp.getContentPane().add(p1);
tp.setResizable(false);
tp.setVisible(true);
tp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
实例三:
package frame;
import java.awt.*;
import javax.swing.*;
public class JFrameWithPanel {
public static void main(String[] args) {
JFrame frame = new JFrame("Frame With Panel");
Container contentPane = frame.getContentPane();
contentPane.setBackground(Color.CYAN); // 将JFrame实例背景设置为蓝绿色
JPanel panel = new JPanel(); // 创建一个JPanel的实例
panel.setBackground(Color.yellow); // 将JPanel的实例背景设置为黄色
JButton button = new JButton("Press me");
panel.add(button); // 将JButton实例添加到JPanel中
contentPane.add(panel, BorderLayout.SOUTH); // 将JPanel实例添加到JFrame的南侧
frame.setSize(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}