GUI(Graphical User Interface) 即图形用户界面,它能够是应用程序看上去更加友好,Java语言之所以会如此流行的一个主要原因也是因为它支持GUI。
AWT简介
1.在Java的早起版本中,GUI组件由名为AWT(Abstract Window Toolkit,抽象窗口工具包)的标准库来提供。除了GUI组件外,AWT还包括其他功能来支持图像绘画、处理剪切/复制类型的数据传送,以及其他的相关操作。
2.java.awt包是Java内置的包,属于Java基础类库(JFC)的一部分,其中包括丰富的界面组件、布局管理器、事件处理模型、图形和图像工具等等。
AWT组件的类体系结构
AWT的缺点:AWT组件最大的缺陷就是它依赖于操作系统,也就是说AWT程序运行在不同的操作系统上会有不同的外观和行为,这一点对于Java的平台无关性来讲,是不忍直视的。
Swing简介
1.Swing组件是在AWT组件上发展而来的轻量级组件,与AWT相比不但改进了用户界面,而且所需的系统资源更少。
2.Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同的外观和相同的行为。
注:上图中蓝色的组件是java.awt包中的对象。
常用的Swing组件
1.javax.swing.JFrame
JFrame组件常用于在Swing程序中创建窗体,常用构造方法:
//创建新窗体,该窗体初始为不可见
JFrame()
//创建新窗体,使用参数title指定标题,该窗体初始为不可见
JFrame(String title)
常用的方法:
//设置窗体的标题,标题内容由参数title指定
void setTitle(String title)
//设置窗体的大小,参数width指定宽度,参数height指定高度,单位为像素
void setSize(int width, int height)
//设置窗体能否调整大小,由参数resizable
void setResizable(boolean resizable)
//设置窗体是否可见,由参数b决定,true为可见,false为不可见
void setVisible(boolean b)
//获取当前窗体的内容面板
Container getContentPane()
//设置窗体在关闭时默认执行的操作
void setDefaultCloseOperation(int operation)
//释放当前窗体及其所有子组件所占用的资源,即卸载窗体
void dispose()
//重新绘制当前窗体
void repaint()
注:对于类似于窗体这样的容器组件,我们一般自定义一个类,继承于JFrame类,然后将窗体中的子组件作为类中成员进行声明,以方便操作:
public class MyFrame extends JFrame
{
……
}
注:容器组件是指可以容纳其他组件的组件。
2.javax.swing.JButton
在Swing程序中,按钮可能是使用量最大的组件之一,JButton则是用来创建按钮的,JButton类的常用构造方法:
//创建一个按钮
JButton()
//创建一个带文本的按钮
JButton(String text)
//创建一个带图标的按钮
JButton(Icon icon)
//创建一个带文本和图标的按钮
JButton(String text, Icon icon)
//设置按钮上的文本
void setText(String text)
//获取按钮上的文本
String getText()
//设置按钮的背景颜色
void setBackground(Color bg)
//获取按钮的背景颜色
Color getBackground()
//设置启用(或禁用)按钮,由参数b来决定
void setEnabled(boolean b)
//设置按钮是否为可见,由参数b决定
void setVisible(boolean b)
//设置按钮的悬停提示信息
void setToolTipText(String text)
//设置按钮的快捷键
void setMnemonic(int mnemonic)
3.javax.swing.JLabel
最简单的Swing组件之一,用于在窗体上显示标签,JLabel既可以显示文本,也可以显示图像,JLabel中常用的构造方法:
//创建一个空的标签
JLabel()
//创建一个带文本的标签
JLabel(String text)
//创建一个带文本的标签,并指定其对齐方式,可以是JLabel.LEFT、JLabel.CENTER和JLabel.RIGHT
JLabel(String text, int ha)
//设置一个带图像的标签
JLabel(Icon image)
//设置一个代图像的标签,并指定其对齐方式
JLabel(Icon image, int ha)
//创建一个带文本和图像的标签并指定其对齐方式
JLabel(String text, Icon image, int ha)
JLabel常用的方法:
//设置标签上的文本
void setText(String text)
//获取标签上的文本
String getText()
//设置标签的图像
void setIcon(Icon icon)
//获取标签的图像
Icon getIcon()
//设置标签中文本的对齐方式
void setHorizontalAlignment(int alignment)
//设置标签是否为可见
void setVisible(boolean b)
4.javax.swing.JTextField
JTextField是文本框组件,主要是用来接收用户的输入,JTextField类常用的构造方法有:
//创建一个空的文本框
JTextField()
//创建一个带文本的文本框
JTextField(String text)
//创建一个指定列数的文本框
JTextField(int columns)
//创建一个带文本,并指定列数的文本框
JTextField(String text, int columns)
JTextField常用的方法:
//设置文本框中的文本
void setText(String text)
//获取文本框中的文本
String getText()
//设置文本框中文本的对齐方式,可以是JTextField.LEFT、JTextField.CENTER、JTextField.RIGHT
void setHorizontalAlignment(int alignment)
//设置文本框是否可以编辑
void setEditable(boolean b)
//设置启用(或禁用)文本框
void setEnabled(boolean enabled)
//设置文本框是否为可见
void setVisible(boolean b)
布局管理器
用户界面上的组件可以按照不同的方式进行排列,例如:水平排列,或者是按网络方式进行排序,这样就需要通过布局管理器来管理这些组件,布局管理器是一组实现了java.awt.LayoutManager接口的类,由这些类自动定位组件,三种基本的布局管理器为:
1.FlowLayout——流式布局
2.BorderLayout——边界布局
3.GridLayout——网格布局
注:框架默认的布局是BorderLayout,所以在框架中想要使用BorderLayout,可以不进行指定,直接使用即可,JPanel默认的布局是FlowLayout即流式布局。
java.swing.JPanel
JPanel提供面板组件,它是轻量级的容器组件,面板中可以添加其他组件,也可以设置布局,我们一般用面板来实现布局嵌套,JPanel常用的构造方法:
//创建一个空面板
JPanel()
//创建一个带有指定布局的面板
JPanel(LayoutManaer layout)
JPanel常用的方法:
//设置面板的背景颜色,由参数bg指定颜色
void setBackground(Color bg)
//设置面板的布局,参数是布局管理器
void setLayout(LayoutManager mgr)
//往面板中添加一个组件
Component add(Component comp)
//将指定的组件添加到面板的指定位置上
Component add(Component comp, int index)
//从面板中移除指定的组件
void remove(Component comp)
//从面板中移除所有的组件
void removeAll()
//重新绘制当前面板
void repaint()
下面我们通过一个案例来深入体会这些组件,先来看看效果:
程序代码:
/**
* 猜数字游戏界面
*
* @author Liao
*
*/
public class GuessNum extends JFrame {
// 文本输入框
private JTextField jTextField;
// 标签
private JLabel jLabel;
// 在构造函数中初始化相关组件
public GuessNum() {
// 创建文本框
jTextField = new JTextField();
// 创建标签
jLabel = new JLabel("请输入一个1000以内的整数");
//设置面板的布局为BorderLayout,其实可以不指定,因为框架默认的布局就是BorderLayout
this.setLayout(new BorderLayout());
//组合成我们想要的布局,把文本框放在北边
this.add(jTextField, BorderLayout.NORTH);
//把标签放在中部
this.add(jLabel,BorderLayout.CENTER);
//把自定义的面板类放在南部
this.add(new SouthPanel(),BorderLayout.SOUTH);
//设置窗体框架的基本属性
this.setSize(500,300);//设置窗体的大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置当窗体关闭的操作时,程序结束
this.setLocationRelativeTo(null);//设置窗体居中显示
this.setVisible(true);//设置窗体可显示
}
/**
* 创建一个内部类来封装南部的相关组件
* @author Liao
*/
public class SouthPanel extends JPanel {
//"猜"按钮
private JButton guess;
//"重新来过按钮"
private JButton restart;
//"退出游戏"按钮
private JButton exit;
//在构造函数中初始化相关组件
public SouthPanel() {
//创建"猜"按钮
guess = new JButton("猜");
//创建"重新来过"按钮
restart = new JButton("重新来过");
//创建"退出游戏按钮"
exit = new JButton("退出游戏");
//因为JPanel的默认布局为FlowLayout即流式布局,我们要指定其为GridLayout即网格布局
this.setLayout(new GridLayout(1,3));
//把按钮添加到JPanel中
this.add(guess);
this.add(restart);
this.add(exit);
}
}
public static void main(String[] args) {
//直接创建窗体对象即可
GuessNum frame = new GuessNum();
}
}
猜数字游戏实现:
/**
* 猜数字游戏实现
*
* @author Liao
*
*/
public class GuessNum extends JFrame {
// 文本输入框
private JTextField jTextField;
// 标签
private JLabel jLabel;
// 在构造函数中初始化相关组件
public GuessNum(int random) {
// 创建文本框
jTextField = new JTextField();
// 创建标签
jLabel = new JLabel("请输入一个1000以内的整数");
//设置面板的布局为BorderLayout,其实可以不指定,因为框架默认的布局就是BorderLayout
this.setLayout(new BorderLayout());
//组合成我们想要的布局,把文本框放在北边
this.add(jTextField, BorderLayout.NORTH);
//把标签放在中部
this.add(jLabel,BorderLayout.CENTER);
//把自定义的面板类放在南部
this.add(new SouthPanel(random),BorderLayout.SOUTH);
//设置窗体框架的基本属性
this.setSize(500,300);//设置窗体的大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置当窗体关闭的操作时,程序结束
this.setLocationRelativeTo(null);//设置窗体居中显示
this.setVisible(true);//设置窗体可显示
}
/**
* 创建一个内部类来封装南部的相关组件
* 实现按钮的监听事件
* @author Liao
*/
public class SouthPanel extends JPanel implements ActionListener{
//"猜"按钮
private JButton guess;
//"重新来过按钮"
private JButton restart;
//"退出游戏"按钮
private JButton exit;
//中奖数字
private int random;
//在构造函数中初始化相关组件
public SouthPanel(int random) {
this.random = random;
//创建"猜"按钮
guess = new JButton("猜");
//创建"重新来过"按钮
restart = new JButton("重新来过");
//创建"退出游戏按钮"
exit = new JButton("退出游戏");
//因为JPanel的默认布局为FlowLayout即流式布局,我们要指定其为GridLayout即网格布局
this.setLayout(new GridLayout(1,3));
//把按钮添加到JPanel中
this.add(guess);
this.add(restart);
this.add(exit);
//设置按钮的监听事件
guess.addActionListener(this);
restart.addActionListener(this);
exit.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
//获取监听事件的源
JButton btn = (JButton) e.getSource();
//判断源,然后处理监听事件
if (btn == guess){
//判断用户输入数字的大小
System.out.println("====>"+random);
if (Integer.parseInt(jTextField.getText()) > random){
jLabel.setText("老兄,你猜的数字太大啦!");
jTextField.setText("");
} else if (Integer.parseInt(jTextField.getText()) < random){
jLabel.setText("老兄,你猜的数字太小啦!");
jTextField.setText("");
} else {
jLabel.setText("老兄,恭喜你中奖啦!");
//使按钮失效
guess.setEnabled(false);
}
} else if (btn == restart){
//随机生成一个1000内的数字
random = (int) (Math.random()*1000);
//设置标签
jLabel.setText("请输入一个1000以内的整数");
//使得"猜"按钮有效
guess.setEnabled(true);
} else if (btn == exit){
System.exit(0);
}
}
}
public static void main(String[] args) {
//产生一个随机数
int random = (int) (Math.random()*1000);
//直接创建窗体对象即可
GuessNum frame = new GuessNum(random);
}
}