java图形用户界面显示多行多列按钮

目的

  1. 了解Swing基本组件的分类、GUI程序的设计方法。
  2. 熟练运用Swing常用组件及其API开发GUI程序。
  3. 理解布局管理器的概念以及常用布局的特点和使用方式。
  4. 深刻理解并熟练使用AWT事件模型与处理机制。

要求

编写满足以下要求的GUI程序。
5. 顶部两个文本框只接受大于0小于11的整数。
6. 文本框数字改变时,自动刷新下部网格区域的按钮。
7. 鼠标进入按钮时,在该按钮上显示“★”,将该按钮背景色设置为红色。
8. 鼠标移出按钮时,隐藏该按钮上的文字,将该按钮背景色设置为绿色。
说明:“★”可经 虚拟键盘 -> 特殊符号 输入

运行效果图

  1. 初始界面在这里插入图片描述
  2. 输入行数:5,列数:6,点击确定按钮,弹出输入成功对话框在这里插入图片描述
  3. .将鼠标移入按钮 按钮背景更改为红色,并显示五角星图标在这里插入图片描述
  4. 鼠标向右移动一格移出按钮,按钮背景变为绿色在这里插入图片描述
  5. 输入行数:30,列数:6在这里插入图片描述
  6. 点击确定按钮 弹出对话框:输入的值不符合要求,已更正为10在这里插入图片描述
  7. 显示成功在这里插入图片描述

部分源码

/*
 * 注册文本框输入事件的监听器
 */
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
			}	
		}	
	}

心得

  1. 用异常的try-catch语句将输入的行数与列数的值进行判断,从而满足了题目要求的输入的值在1-10之间。
  2. 同时在其中加入适当的弹出信息对话框,让程序更加人性化。
  3. 使用keyTyped()方法,获得了键盘输入的字符,利用if语句if (!(key >= KeyEvent.VK_0 && key <= KeyEvent.VK_9))e.consume(); 实现了非数字字符无法输入的功能。
  4. 写程序过程中开始无法解决所有按钮的添加鼠标进入移出事件,经过多次尝试和查阅百度,发现将事件放入添加按钮的for循环中即可快速解决。

附加

程序完整源代码请查阅https://download.csdn.net/download/qq_45556665/12657486
需要设计报告的请关注收藏私聊~~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敷衍zgf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值