十七、Swing程序设计(一)
1. Swing概述
原来的AWT组件来自java.awt包,当含有AWT组件的java应用程序在不同的平台上执行时,每个平台的GUI组件显示会有所不同,但是在不同平台上运行使用Swing开发的应用程序时,就可以统一GUI组件的风格,因为Swing组件允许编程人员在跨平台时指定统一的外观风格。
-
Swing组件通常被称为“轻量级组件”,因为它完全用JAVA语言编写,而JAVA是不依赖操作系统的语言,它可以在任何平台上运行;相反,依赖于本地平台的组件被称为“重量级组件”,如AWT组件就是依赖本地平台的窗口系统来决定组件的功能、外观和风格。
常用的Swing组件
组件名称 | 定义 |
---|---|
JButton | 代表Swing按钮,按钮可以带一些图片或文字 |
JCheckBox | 代表Swing中的复选框组件 |
JComBox | 代表下拉列表框,可以在下拉显示区域显示多个选项 |
JFrame | 代表Swing框架类 |
JDialog | 代表Swing版本的对话框 |
JLabel | 代表Swing中的标签组件 |
JRadioButton | 代表Swing的单选按钮 |
JList | 代表能够在用户界面中显示一系列条目的组件 |
JTextField | 代表文本框 |
JPasswordField | 代表密码框 |
JTextArea | 代表Swing中的文本区域 |
JOptionPane | 代表Swing中的一些对话框 |
2. 常用窗体
JFrame窗体
JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载这些Swing组件的容器。在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体,在这个窗体中添加组件,同时为组件设置事件。由于该窗体继承了JFrame类,所以它拥有“最大化”“最小化”“关闭”等按钮。
JFrame在程序的语法格式如下:
JFrame jf=new JFrame(title);
Container container=jf.getContentPane();
container.add(new JButton("按钮")); //JButton按钮组件
container.remove(new JButton("按钮")); //删除按钮组件
创建JFrame窗体实例:
package lianxi3;
import java.awt.*;
import javax.swing.*;
public class Example1 extends JFrame {
private static final long serialVersionUID = 1L;
// 定义一个类继承JFrame类
public void CreateJFrame(String title) { // 定义一个CreateJFrame()方法
JFrame jf = new JFrame(title); // 实例化一个JFrame对象
Container container = jf.getContentPane(); // 获取一个容器
JLabel jl = 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);
}
public static void main(String args[]){//在主方法中调用createJFrame()方法
new Example1().CreateJFrame("创建一个JFrame窗体");
}
}
运行结果:
- 创建窗体后,需要给予窗体一个关闭方式,可以调用setDefaultCloseOperation()方法关闭窗体。JAVA为窗体关闭提供了多种方式,常用的有:DO_NOTHING_ON_CLOSE、DISPOSE_ON_CLOSE、HIDE-ON_CLOSE、EXIT_ON_CLOSE。
JDialog窗体
- JDialog窗体的功能是从一个窗体中弹出另外一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。JDialog窗体实质上就是另一种类型的窗体,它与JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的属性。
创建JDialog窗体实例:
package com.lzw;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyJDialog extends JDialog { // 创建新类继承JDialog类
private static final long serialVersionUID = 1L;
public MyJDialog(MyFrame frame) {
// 实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
super(frame, "第一个JDialog窗体", true);
Container container = getContentPane(); // 创建一个容器
container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
setBounds(120, 120, 100, 100); // 设置对话框窗体大小
}
}
public class MyFrame extends JFrame { // 创建新类
private static final long serialVersionUID = 1L;
public static void main(String args[]) {
new MyFrame(); // 实例化MyJDialog类对象
}
public MyFrame() {
Container container = getContentPane(); // 创建一个容器
container.setLayout(null);
JLabel jl = new JLabel("这是一个JFrame窗体"); // 在窗体中设置标签
// 将标签的文字置于标签中间位置
jl.setHorizontalAlignment(SwingConstants.CENTER);
container.add(jl);
JButton bl = new JButton("弹出对话框"); // 定义一个按钮
bl.setBounds(10, 10, 100, 21);
bl.addActionListener(new ActionListener() { // 为按钮添加鼠标单击事件
public void actionPerformed(ActionEvent e) {
// 使MyJDialog窗体可见
new MyJDialog(MyFrame.this).setVisible(true);
}
});
container.add(bl); // 将按钮添加到容器中
container.add(bl);
container.setBackground(Color.white);
setSize(200, 200);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setVisible(true);
}
}
运行结果:
- 由本实例可以看到,JDialog窗体与JFrame窗体形式基本相同,甚至在设置窗体的特性时调用的方法名称都基本相同,如设置窗体大小、窗体关闭状态等。
3. 标签组件与图标
- 在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些组件的目的,所以标签在Swing中是比较常用的组件。
标签的使用
- public JLabel():创建一个不带图标和文本的JLabel对象
- public JLabel(Icon icon):创建一个带图标的JLabel对象
- public JLabel(Icon icon,int aligment):创建一个带图标的JLabel对象,并设置图标水平对齐方式
- public JLabel(String text,int aligment):创建一个带文本的JLabel对象,并设置文字水平对齐方式
- public JLabel(String text,Icon icon,int aligment):创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式
图标的使用
- 直接使用程序案例说明更加容易理解:
创建图标:
package com.lzw;
import java.awt.*;
import javax.swing.*;
public class DrawIcon implements Icon { // 实现Icon接口
private int width; // 声明图标的宽
private int height; // 声明图标的长
public int getIconHeight() { // 实现getIconHeight()方法
return this.height;
}
public int getIconWidth() { // 实现getIconWidth()方法
return this.width;
}
public DrawIcon(int width, int height) { // 定义构造方法
this.width = width;
this.height = height;
}
// 实现paintIcon()方法
public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
arg1.fillOval(x, y, width, height); // 绘制一个圆形
}
public static void main(String[] args) {
DrawIcon icon = new DrawIcon(15, 15);
// 创建一个标签,并设置标签上的文字在标签正中间
JLabel j = new JLabel("测试", icon, SwingConstants.CENTER);
JFrame jf = new JFrame(); // 创建一个JFrame窗口
Container c = jf.getContentPane();
c.add(j);
jf.setSize(100,100);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
运行结果:
使用图片图标:
package com.lzw;
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class MyImageIcon extends JFrame {
private static final long serialVersionUID = 1L;
public MyImageIcon() {
Container container = getContentPane();
// 创建一个标签
JLabel jl = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
// 获取图片所在的URL
URL url = MyImageIcon.class.getResource("imageButton.jpg");
Icon icon = 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);
}
public static void main(String args[]) {
new MyImageIcon(); // 实例化MyImageIcon对象
}
}
运行结果:
- java.lang.Class类中的getResource()方法可以获取资源文件的URL路径。上例中该方法的参数是imageButton.jpg,这个路径是相对于MyImageIcon类文件的,所以可将imageButton.jpg图片文件与MyImageIcon类文件放在同一个文件夹下。