java提供的GUI类分别在java.awt包和java.swing包中。AWT包是java早期版本的包,是一个简单有限的GUI组件布局工具包,Swing包是后期的包,用起来更加灵活且功能更加丰富。
1.组件
在GUI程序设计中,组件(Component)是GUI的基本组成元素,凡是能够以图形化方式显示在屏幕上并能与用户交互的对象均为组件。
如下图:均为GUI界面的组件
另外,在JDK的java.awt包中定义了多种GUI组件类,如Window、Menu、Button、Label、TextField、Scrollbar等。
由上图可以看出,GUI中的组件可分为:
接下来通过一个简单的GUI类来说明组件类的使用
import java.awt.*;
import javax.swing.*;
public class HelloSwing extends JFrame {
/* 构造方法 */
public HelloSwing() {
super("组件显示") ; //在窗口Frame最上方设置标题"组件显示"
Container c = this.getContentPane(); //初始化容器
c.setLayout(new FlowLayout()); //设置容器排列组件的形式
JTextField text = new JTextField(10); //创建文本框长度为10
JLabel label = new JLabel("message:"); //创建标签"message:"
JButton btn = new JButton("OK"); //创建按钮
/* 添加标签、文本框和按钮到容器 */
c.add(label);
c.add(text);
c.add(btn);
//当关闭窗口是结束程序运行
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口的大小
this.setSize(300, 100);
//设置窗口可见
this.setVisible(true);
}
public static void main(String[] args) {
// 创建窗口的一个实例
HelloSwing hello = new HelloSwing();
}
}
运行后会显示一个图形化的界面
不过平时我们看到的许多界面都是看起来酷炫的,java应用系统界面的布局是通过各种简单布局器(Layout)的组合来实现布局的,常见的布局管理器有BorderLayout(边界布局)、FlowLayout(流布局)、GridLayout(网格布局)。这个比较简单,我就不说了,不清楚的同学可以自行百度或Google一下。
2.GUI事件处理
GUI用很简单的方式接受用户命令,例如移动或点击鼠标、按键盘、触摸屏幕等。通常对一个键盘或鼠标的操作会引发应用系统预先定义好的事件、对每一个可能发生的事件,应用系统都有监听、响应并处理的方法,而我们需要了解事件如何处理。
用户界面事件要素有:事件源、事件对象、事件监听器、事件源注册。
比如对于动作事件(Action Event),若要对他们进行处理、在GUI类中必须做以下几件事:
(1):创建事件源
Button clearbtn = new Button("clear");
当用户点击这个名为”clear”的按钮时,Button类会创建一个ActionEvent的事件对象。
(2):注册事件源到监听器
clearbtn.addActionListener(this);
实现向组件注册事件监听器的方法是addXXXListener,其中XXX代表事件,注册的过程就是调用组件的addXXXListener方法。
(3):编写具体代码以实现监听器接口ActionListener的接受事件、委派事件、处理事件的方法。
3.实例:计算圆的面积和周长
定义Circle类
public class Circle {
private int radius;
//构造方法
public Circle(int radius) {
setRadius(radius);
}
//计算周长
public double calGirth() {
return 2*3.14159*radius;
}
//计算面积
public double calArea() {
return 3.14159*radius*radius;
}
/* Getters and Setters*/
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
}
定义GUI类
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
public class Calculate extends JFrame implements ActionListener {
Circle thecircle;
JLabel messageLabel;
JTextField messageText;
JButton calBtn;
JButton closeBtn;
JTextArea resultText;
public Calculate () {
super("计算圆的面积和周长");
/* 创建容器 */
Container c = this.getContentPane();
c.setLayout(new FlowLayout());
JPanel centerPanel = new JPanel(new FlowLayout());
/* 创建标签、文本框和按钮 */
messageLabel = new JLabel("输入圆的半径: ");
messageText = new JTextField(5);
calBtn = new JButton("计算");
closeBtn = new JButton("关闭窗口");
JTextArea resultText = new JTextArea("计算结果: ",4,20);
/* 添加组件到容器 */
centerPanel.add(messageLabel);
centerPanel.add(messageText);
centerPanel.add(calBtn);
centerPanel.add(closeBtn);
c.add(centerPanel);
c.add(resultText);
/* 注册事件到监听器 */
calBtn.addActionListener(this);
closeBtn.addActionListener(this);
//当关闭窗口是结束程序运行
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口的大小
this.setSize(360, 170);
//设置窗口可见
this.setVisible(true);
}
/* 实现接口ActionListener的方法,获得事件对象来处理事件 */
public void actionPerformed(ActionEvent e) {
if(e.getSource() == calBtn) {
calculate();
}
if(e.getSource() == closeBtn) {
shutDown();
}
}
/* 处理“计算”方法 */
private void calculate() {
String message = messageText.getText();
if(message.length() == 0) {
JOptionPane.showMessageDialog(null, "请输入圆的半径!","提示",1);
}else {
int radius = Integer.parseInt(message);
/* 创建实例并计算周长和面积 */
thecircle = new Circle(radius);
int theRadius = thecircle.getRadius();
double girth = thecircle.calGirth();
double area = thecircle.calArea();
/* 在文本区域中显示计算的结果,小数点后保留两位 */
resultText.setText("计算结果如下: ");
resultText.append("\n圆的半径是"+theRadius);
resultText.append("\n圆的周长是"+new DecimalFormat("#.00").format(girth));
resultText.append("\n圆的面积是"+new DecimalFormat("#.00").format(area));
}
}
/* 关闭方法 */
public void shutDown() {
System.exit(0);
}
public static void main(String[] args) {
new Calculate ();
}
}
编译运行后的结果
如果用户没有输入数据,单击“计算”按钮后,将出现提示信息小窗口