目的
- 了解Swing基本组件的分类、GUI程序的设计方法。
- 熟练运用Swing常用组件及其API开发GUI程序。
- 理解布局管理器的概念以及常用布局的特点和使用方式。
- 深刻理解并熟练使用AWT事件模型与处理机制。
要求
编写满足以下要求的GUI程序。
5. 顶部两个文本框只接受大于0小于11的整数。
6. 文本框数字改变时,自动刷新下部网格区域的按钮。
7. 鼠标进入按钮时,在该按钮上显示“★”,将该按钮背景色设置为红色。
8. 鼠标移出按钮时,隐藏该按钮上的文字,将该按钮背景色设置为绿色。
说明:“★”可经 虚拟键盘 -> 特殊符号 输入
运行效果图
- 初始界面
- 输入行数:5,列数:6,点击确定按钮,弹出输入成功对话框
- .将鼠标移入按钮 按钮背景更改为红色,并显示五角星图标
- 鼠标向右移动一格移出按钮,按钮背景变为绿色
- 输入行数:30,列数:6
- 点击确定按钮 弹出对话框:输入的值不符合要求,已更正为10
- 显示成功
部分源码
/*
* 注册文本框输入事件的监听器
*/
class MyKeyListener extends KeyAdapter {
public void keyTyped(KeyEvent e) {
char key = e.getKeyChar(); // 获取输入的字符
if (!(key >= KeyEvent.VK_0 && key <= KeyEvent.VK_9)) { // 输入的字符不是数字
e.consume(); //不显示除了整型数字以外的其他字符
}
}
}
public class Exp5_2 extends MouseAdapter{//继承适配器类
int row,col;//定义行和列
BaseFrame f = new BaseFrame("图形用户界面显示多行多列按钮");
MyKeyListener keyListener = new MyKeyListener();
/*
* 创建两个文本框用于输入行和列
*/
JTextField t01 = new JTextField("输入1-10");// 设置初始文字 指定列数
JTextField t02 = new JTextField("输入1-10");// 设置初始文字 指定列数
/*
* 创建两个面板
*/
JPanel topPan = new JPanel(); // 顶部标签面板
JPanel buttonPan = new JPanel(); // 按钮面板
public static void main(String[] args) {
new Exp5_2().init();//创建并调用初始化方法
}
void init() {
f.add(topPan, BorderLayout.NORTH);//将画板添加到窗口上,使用边界布局向北
f.add(buttonPan, BorderLayout.CENTER);//将画板添加到窗口上,使用边界布局居中
JButton b1 = new JButton("确定");
b1.setFont(new Font("微软雅黑", Font.PLAIN,24));
//鼠标监听事件注册——点击按钮
Event m = new Event();
b1.addActionListener(m);
//设置面板为网格布局
topPan.setLayout(new GridLayout(1,5));
JLabel j01 = new JLabel("请输入行数:");
j01.setFont(new Font("微软雅黑", Font.BOLD, 24)); // 设置字体
topPan.add(j01);
t01.setHorizontalAlignment(SwingConstants.CENTER);//文本框文字居中
t01.setForeground(Color.RED); // 设置文字颜色(前景色)
t01.setFont(new Font("微软雅黑", Font.PLAIN, 20)); // 设置字体
t01.addKeyListener(keyListener);
topPan.add(t01);
JLabel j02 = new JLabel("请输入列数:");
j02.setFont(new Font("微软雅黑", Font.BOLD, 24)); // 设置字体
topPan.add(j02);
t02.setHorizontalAlignment(SwingConstants.CENTER);//文本框文字居中
t02.setForeground(Color.RED); // 设置文字颜色(前景色)
t02.setFont(new Font("微软雅黑", Font.PLAIN, 20)); // 设置字体
t02.addKeyListener(keyListener);
topPan.add(t02);
topPan.add(b1);//按钮添加到面板
f.showMe();
}
//事件监听
class Event implements ActionListener{
public void actionPerformed(ActionEvent e) {
row = Integer.parseInt(t01.getText());//得到文本框输入的行数
col = Integer.parseInt(t02.getText());//得到文本框输入的列数
boolean find = true;//定义布尔类型 find,初始值为true 用于判断输入的值是否合法
/*
* 异常捕获 将输入的值进行处理:合法的直接使用、不合法的修改为10
*/
try {
if(row>10||col>10) {
find = false;
}
if(find) {//当输入的值都合法——行和列输入的值都小于等于10,弹出对话框:输入成功
JOptionPane.showMessageDialog(null,"输入成功!");
}
else {
if(row>10&&col>10) {//当输入的行数和列数都大于10
row=10;//将行数修改为10
t01.setText(""+row);//输出在文本框
col=10;//将列数修改为10
t02.setText(""+col);//输出在文本框
}else if(row<10&&col>10) {//当输入的行数小于10 列数大于10
col=10;//将列数修改为10
t02.setText(""+col);//输出在文本框
}else {
row=10;
t01.setText(""+row);
}
//弹出对话框:输入的值不符合要求,已更正为10!
JOptionPane.showMessageDialog(null,"输入的值不符合要求,已更正为10!");
}
buttonPan.setLayout(new GridLayout(row, col, 2, 2)); // 设置网格布局
/*
* 利用for循环 将按钮添加到面板,并添加事件监听
*/
for(int i = 0; i < row*col; i++) {
JButton bu_i = new JButton();
buttonPan.add(bu_i); // 添加按钮到网格的下一个位置
bu_i.addMouseListener(new MouseAdapter(){
//鼠标进入事件
public void mouseEntered(MouseEvent e) {
bu_i.setText("★");//设置按钮背景图片 星号
bu_i.setFont(new Font("微软雅黑", Font.PLAIN,40));
bu_i.setBackground(Color.RED);//按钮背景为红色
}
//鼠标离开事件
public void mouseExited(MouseEvent e) {
bu_i.setText("");//去掉按钮背景图片星号
bu_i.setBackground(Color.GREEN);//按钮背景为绿色
}
});
}
f.showMe();
}
catch (Exception e2) {
// TODO: handle exception
}
}
}
心得
- 用异常的try-catch语句将输入的行数与列数的值进行判断,从而满足了题目要求的输入的值在1-10之间。
- 同时在其中加入适当的弹出信息对话框,让程序更加人性化。
- 使用keyTyped()方法,获得了键盘输入的字符,利用if语句if (!(key >= KeyEvent.VK_0 && key <= KeyEvent.VK_9))e.consume(); 实现了非数字字符无法输入的功能。
- 写程序过程中开始无法解决所有按钮的添加鼠标进入移出事件,经过多次尝试和查阅百度,发现将事件放入添加按钮的for循环中即可快速解决。
附加
程序完整源代码请查阅https://download.csdn.net/download/qq_45556665/12657486
需要设计报告的请关注收藏私聊~~