16.Swing程序设计
1.Swing概述--Swing主要用来开发GUI程序,GUI即图形图像界面,他是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮等元素。
1.1Swing的特点--允许开发人员跨平台时指定统一的外观和风格,Swing不依赖操作系统,可以在多平台上使用,将Swing组件称为‘轻量级组件’AWT组件则相反比较依赖本地操作系统,所以被称为‘重量级组件’
1.2Swing包
1.3常用Swing组件
2常用窗体
2.1JFrame窗体--是一个容器,是Swing程序中各组件的载体
JFrame类的常用构造方法:
1)public JFrame():创建一个不可见、没有标题的新窗体。
2)public JFrame(String title):创建一个不可见但有标题的窗体
jJFrame常用方法
代码实现:
public classJFreamTest extends JFrame {
publicvoid CreateJFrame(String title) { // 定义一个CreateJFrame()方法
JFramejf = new JFrame(title); // 创建一个JFrame对象
Containercontainer = jf.getContentPane(); // 获取一个容器
JLabeljl = new JLabel("这是一个JFrame窗体"); // 创建一个JLabel标签
//使标签上的文字居中
jl.setHorizontalAlignment(SwingConstants.CENTER);
container.add(jl);// 将标签添加到容器中
container.setBackground(Color.white);// 设置容器的背景颜色
jf.setVisible(true);// 使窗体可视
jf.setSize(200,150); // 设置窗体大小
//设置窗体关闭方式
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
publicstatic void main(String args[]) { // 在主方法中调用CreateJFrame()方法
newJFreamTest().CreateJFrame("创建一个JFrame窗体");
}
}
运行结果:
2.2JDialog对话框窗体--是Swing组件中的对话框,功能是从一个窗体中实例化。
常用Jdialog构造类
代码实现:
class MyJDialog extends JDialog { // 创建新类继承JDialog类
privatestatic final long serialVersionUID = 1L;
publicMyJDialog(MyFrame frame) {
//实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
super(frame,"第一个JDialog窗体", true);
Containercontainer = getContentPane(); // 创建一个容器
container.add(newJLabel("这是一个对话框")); // 在容器中添加标签
setBounds(120,120, 100, 100); // 设置对话框窗体大小
}
}
public class MyFrame extends JFrame { //创建新类
privatestatic final long serialVersionUID = 1L;
publicstatic void main(String args[]) {
newMyFrame(); // 实例化MyJDialog类对象
}
publicMyFrame() {
Containercontainer = getContentPane(); // 创建一个容器
container.setLayout(null);
JLabeljl = new JLabel("这是一个JFrame窗体"); // 在窗体中设置标签
//将标签的文字置于标签中间位置
jl.setHorizontalAlignment(SwingConstants.CENTER);
container.add(jl);
JButtonbl = new JButton("弹出对话框"); // 定义一个按钮
bl.setBounds(10,10, 100, 21);
bl.addActionListener(newActionListener() { // 为按钮添加鼠标单击事件
publicvoid actionPerformed(ActionEvent e) {
//使MyJDialog窗体可见
newMyJDialog(MyFrame.this).setVisible(true);
}
});
container.add(bl);// 将按钮添加到容器中
container.add(bl);
container.setBackground(Color.white);
setSize(200,200);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setVisible(true);
}
}
运行结果:
3常用布局管理器:
3.1绝对布局--硬性指定组件在容器中的位置和大小,可以使用绝对坐标来指定组件的位置。
代码实现:
public classAbsolutePosition extends JFrame {
/**
*
*/
privatestatic final long serialVersionUID = 1L;
publicAbsolutePosition() {
setTitle("本窗体使用绝对布局");// 设置该窗体的标题
setLayout(null);// 使该窗体取消布局管理器设置
setBounds(0,0, 200, 150); // 绝对定位窗体的位置与大小
Containerc = getContentPane(); // 创建容器对象
JButtonb1 = new JButton("按钮1"); // 创建按钮
JButtonb2 = new JButton("按钮2"); // 创建按钮
b1.setBounds(10,30, 80, 30); // 设置按钮的位置与大小
b2.setBounds(60,70, 100, 20);
c.add(b1);// 将按钮添加到容器中
c.add(b2);
setVisible(true);// 使窗体可见
//设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
publicstatic void main(String[] args) {
newAbsolutePosition();
}
}
运行结果:
3.2流布局--最基本的布局管理器,在整个容器中的布局正如其名,像‘流’一样从左到右摆放组件,知道占据这一行的所有空间,在向下移动一行。
代码实现:
public classFlowLayoutPosition extends JFrame {
/**
*
*/
privatestatic final long serialVersionUID = 1L;
publicFlowLayoutPosition() {
setTitle("本窗体使用流布局管理器");// 设置窗体标题
Containerc = getContentPane();
//设置窗体使用流布局管理器,使组件右对齐,并且设置组件之间的水平间隔与垂直间隔
setLayout(newFlowLayout(2, 10, 10));
for(int i = 0; i < 10; i++) { // 在容器中循环添加10个按钮
c.add(newJButton("button" + i));
}
setSize(300,200); // 设置窗体大小
setVisible(true);// 设置窗体可见
//设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
publicstatic void main(String[] args) {
newFlowLayoutPosition();
}
}
运行结果:
3.3边界布局--默认不指定窗体布局时,Swing指定的布局模式是边界布局
代码实现:
public classBorderLayoutPosition extends JFrame {
publicBorderLayoutPosition() {
setTitle("这个窗体使用边界布局管理器");
Containerc = getContentPane(); // 定义一个容器
setLayout(newBorderLayout()); // 设置容器为边界布局管理器
JButtoncenterBtn = new JButton("中"),
northBtn= new JButton("北"),
southBtn= new JButton("南"),
westBtn= new JButton("西"),
eastBtn= new JButton("东");
c.add(centerBtn,BorderLayout.CENTER);// 中部添加按钮
c.add(northBtn,BorderLayout.NORTH);// 北添加按钮
c.add(southBtn,BorderLayout.SOUTH);// 南部添加按钮
c.add(westBtn,BorderLayout.WEST);// 西部添加按钮
c.add(eastBtn,BorderLayout.EAST);// 东部添加按钮
setSize(350,200); // 设置窗体大小
setVisible(true);// 设置窗体可见
//设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
publicstatic void main(String[] args) {
newBorderLayoutPosition();
}
}
运行结果:
3.4网格布局--将容器划分为网格,所有组件可以按行和列进行排列
网格布局主要有以下两个构造方法
1)public GridLayout(int rows,int columns)方法。
2)public GridLayout(int rows,int columns,int horizGap,int vertGap)方法。
代码实现:
public classGridLayoutPosition extends JFrame {
/**
*
*/
privatestatic final long serialVersionUID = 1L;
publicGridLayoutPosition() {
Containerc = getContentPane();
//设置容器使用网格布局管理器,设置7行3列的网格
setLayout(newGridLayout(7, 3, 5, 5));
for(int i = 0; i < 20; i++) {
c.add(newJButton("button" + i)); // 循环添加按钮
}
setSize(300,300);
setTitle("这是一个使用网格布局管理器的窗体");
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
publicstatic void main(String[] args) {
newGridLayoutPosition();
}
}
运行结果
4常用面板
4.1JPanel面板--是一种容器,他继承java.awt.Container类。
代码实现:
public classJPanelTest extends JFrame {
/**
*
*/
privatestatic final long serialVersionUID = 1L;
publicJPanelTest() {
Containerc = getContentPane();
//将整个容器设置为2行1列的网格布局
c.setLayout(newGridLayout(2, 1, 10, 10));
//初始化一个面板,设置1行3列的网格布局
JPanelp1 = new JPanel(new GridLayout(1, 3, 10, 10));
JPanelp2 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanelp3 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanelp4 = new JPanel(new GridLayout(2, 1, 10, 10));
p1.setBorder(BorderFactory.createTitledBorder("面板1"));
p2.setBorder(BorderFactory.createTitledBorder("面板2"));
p3.setBorder(BorderFactory.createTitledBorder("面板3"));
p4.setBorder(BorderFactory.createTitledBorder("面板4"));
p1.add(newJButton("1")); // 在面板中添加按钮
p1.add(newJButton("1"));
p1.add(newJButton("2"));
p1.add(newJButton("3"));
p2.add(newJButton("4"));
p2.add(newJButton("5"));
p3.add(newJButton("6"));
p3.add(newJButton("7"));
p4.add(newJButton("8"));
p4.add(newJButton("9"));
c.add(p1);// 在容器中添加面板
c.add(p2);
c.add(p3);
c.add(p4);
setTitle("在这个窗体中使用了面板");
setSize(420,200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
publicstatic void main(String[] args) {
newJPanelTest();
}
}
运行结果:
4.2JScrollPane滚动面板--带滚动条的
代码实现:
public classJScrollPaneTest extends JFrame {
/**
*
*/
privatestatic final long serialVersionUID = 1L;
publicJScrollPaneTest() {
Containerc = getContentPane(); // 创建容器
JTextAreata = new JTextArea(20, 50); // 创建文本区域组件
JScrollPanesp = new JScrollPane(ta); // 创建JScrollPane面板对象
c.add(sp);// 将该面板添加到该容器中
setTitle("带滚动条的文字编译器");
setSize(200,200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
publicstatic void main(String[] args) {
newJScrollPaneTest();
}
}
运行结果:
5标签组件与图标
5.1JLabel标签组件--简单的显示文本和图片
JLabel的构造方法
5.2图标的使用
1)创建图标
代码实现:
public classDrawIcon implements Icon { // 实现Icon接口
privateint width; // 声明图标的宽
privateint height; // 声明图标的长
publicint getIconHeight() { // 实现getIconHeight()方法
returnthis.height;
}
publicint getIconWidth() { // 实现getIconWidth()方法
returnthis.width;
}
publicDrawIcon(int width, int height) { // 定义构造方法
this.width= width;
this.height= height;
}
//实现paintIcon()方法
publicvoid paintIcon(Component arg0, Graphics arg1, int x, int y){
arg1.fillOval(x,y, width, height); // 绘制一个圆形
}
publicstatic void main(String[] args) {
DrawIconicon = new DrawIcon(15, 15);
//创建一个标签,并设置标签上的文字在标签正中间
JLabelj = new JLabel("测试", icon, SwingConstants.CENTER);
JFramejf = new JFrame(); // 创建一个JFrame窗口
Containerc = jf.getContentPane();
c.add(j);
jf.setSize(100,100);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
运行结果:
2)使用图片创建图标
代码实现:
public classMyImageIcon extends JFrame {
privatestatic final long serialVersionUID = 1L;
publicMyImageIcon() {
Containercontainer = getContentPane();
//创建一个标签
JLabeljl = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
//获取图片所在的URL
URLurl = MyImageIcon.class.getResource("imageButton.jpg");
Iconicon = new ImageIcon(url); // 实例化Icon对象
jl.setIcon(icon);// 为标签设置图片
//设置文字放置在标签中间
jl.setHorizontalAlignment(SwingConstants.CENTER);
jl.setOpaque(true);// 设置标签为不透明状态
container.add(jl);// 将标签添加到容器中
setSize(250,100); // 设置窗体大小
setVisible(true);// 使窗体可见
//设置窗体关闭模式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
publicstatic void main(String args[]) {
newMyImageIcon(); // 实例化MyImageIcon对象
}
}
运行结果:
6文本组件
6.1JTextField文本框组件
代码实现:
public classJTextFieldTest extends JFrame{
/**
*
*/
privatestatic final long serialVersionUID = 1L;
publicJTextFieldTest(){
setSize(250,100);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Containercp=getContentPane();
getContentPane().setLayout(newFlowLayout());
finalJTextField jt=new JTextField("aaa",20);
finalJButton jb=new JButton("清除");
cp.add(jt);
cp.add(jb);
jt.addActionListener(newActionListener(){
publicvoid actionPerformed(ActionEvent arg0) {
//TODO 自动生成方法存根
jt.setText("触发事件");
}
});
jb.addActionListener(newActionListener(){