swing中的事件监听

1.按钮监听
创建一个匿名类实现ActionListener接口,当按钮被点击时,actionPerformed方法就会被调用
代码如下:

package gui2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestGUI {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame f = new JFrame("123");
		f.setSize(400,300);
		f.setLocation(580,200);
		f.setLayout(null);
		
		final JLabel l = new JLabel();
		
		ImageIcon i = new ImageIcon("D:/shana.png");
		l.setIcon(i);
		l.setBounds(50,50,i.getIconWidth(),i.getIconHeight());
		
		JButton b = new JButton("隐藏图片");
		b.setBounds(150,200,100,30);
		
		// 给按钮 增加 监听
//		b.addActionListener(new ActionListener() {
//			
//			// 当按钮被点击时,就会触发 ActionEvent事件
//            // actionPerformed 方法就会被执行
//			public void actionPerformed(ActionEvent e) {
//				l.setVisible(false);
//			}
//		});
		b.addActionListener((e) -> l.setVisible(false));//这里也可以写成lambda表达式
		f.add(l);
		f.add(b);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

}

效果:
点击隐藏图片,图片就会消失。

2.键盘监听
键盘监听器: KeyListener
keyPressed 代表 键被按下
keyReleased 代表 键被弹起
keyTyped 代表 一个按下弹起的组合动作
KeyEvent.getKeyCode() 可以获取当前点下了哪个键
代码如下:

package gui2;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test2 {

	public static void main(String[] args) {
		JFrame f = new JFrame("123");
		f.setSize(400,300);
		f.setLocation(580,200);
		f.setLayout(null);
		
		final JLabel l = new JLabel();
		ImageIcon i = new ImageIcon("D:/shana.png");
		l.setIcon(i);
		l.setBounds(50,50,i.getIconWidth(),i.getIconHeight());
		// 增加键盘监听
		f.addKeyListener(new KeyListener() {
			//键被按下
			@Override
			public void keyTyped(KeyEvent e) {
				
			}
			// 键被弹起
			@Override
			public void keyReleased(KeyEvent e) {
				if(e.getKeyCode() == 39) {
					l.setLocation(l.getX() + 10,l.getY());
				}
			}
			// 一个按下弹起的组合动作
			@Override
			public void keyPressed(KeyEvent e) {
				
			}
		});
		
		f.add(l);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

}

实际上增加键盘监听就是对KeyListener进行实现
效果:按向右键,图片向右移动。

3.鼠标监听
MouseListener 鼠标监听器
mouseReleased 鼠标释放
mousePressed 鼠标按下
mouseExited 鼠标退出
mouseEntered 鼠标进入
mouseClicked 鼠标点击
在本例中,使用mouseEntered,当鼠标进入图片的时候,图片就移动位置

代码如下:

package gui2;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test3 {

	public static void main(String[] args) {
		final JFrame f = new JFrame("123");
		f.setSize(800,600);
		f.setLocationRelativeTo(null);
		f.setLayout(null);
		
		final JLabel l = new JLabel();
		ImageIcon i = new ImageIcon("D:/shana.png");
		l.setIcon(i);
		l.setBounds(375,275,i.getIconWidth(),i.getIconHeight());
		
		f.add(l);
		
		l.addMouseListener(new MouseListener() {
			// 释放鼠标
			@Override
			public void mouseReleased(MouseEvent e) {
				
			}
			// 按下鼠标
			@Override
			public void mousePressed(MouseEvent e) {
				
			}
			// 鼠标退出
			@Override
			public void mouseExited(MouseEvent e) {
				
			}
			// 鼠标进入
			@Override
			public void mouseEntered(MouseEvent e) {
				Random r = new Random();
				int x = r.nextInt(f.getWidth() - l.getWidth());
				int y = r.nextInt(f.getHeight() - l.getHeight());
				
				l.setLocation(x, y);
			}
			// 按下释放组合动作为点击鼠标
			@Override
			public void mouseClicked(MouseEvent e) {
				
			}
		});
		
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}

4.适配器
MouseAdapter 鼠标监听适配器
一般说来在写监听器的时候,会实现MouseListener。
但是MouseListener里面有很多方法实际上都没有用到,比如mouseReleased ,mousePressed,mouseExited等等。
这个时候就可以使用 鼠标监听适配器,MouseAdapter 只需要重写必要的方法即可。

代码如下:

package gui2;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test4 {

	public static void main(String[] args) {
		final JFrame f = new JFrame("123");
		f.setSize(800,600);
		f.setLocationRelativeTo(null);
		f.setLayout(null);
		
		final JLabel l = new JLabel();
		
		ImageIcon i = new ImageIcon("D:/shana.png");
		l.setIcon(i);
		l.setBounds(375,275,i.getIconWidth(),i.getIconHeight());
		
		f.add(l);
		l.addMouseListener(new MouseAdapter() {
			public void mouseEntered(MouseEvent e) {
				Random r = new Random();
				int x = r.nextInt(f.getWidth() - l.getWidth());
				int y = r.nextInt(f.getHeight() - l.getHeight());
				
				l.setLocation(x, y);
			}
		});
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}

现在的效果和之前一样,但是代码却简洁了好多。

5.练习1
题目:
把按钮监听中的按钮上的文字从“隐藏图片” 改为 “显示图片”。

第一次点击的时候,会使得图片隐藏,第二次点击的时候,会使得图片显示,如此循环下去。

一旦点击了"隐藏图片",按钮上的文字就要变成“显示图片” 。。。 如此循环

代码如下:

package gui2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test5 {

	public static void main(String[] args) {
		JFrame f = new JFrame("123");
		f.setSize(400,300);
		f.setLocation(580,200);
		f.setLayout(null);
		
		final JLabel l = new JLabel();
		ImageIcon i = new ImageIcon("D:/shana.png");
		l.setIcon(i);
		l.setBounds(50, 50, i.getIconWidth(), i.getIconHeight());
		
		JButton b = new JButton("隐藏图片");
		b.setBounds(150, 200, 100, 30);
		
		// 给按钮 增加 监听
		b.addActionListener(new ActionListener() {
			// 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
			boolean hide = false;
			public void actionPerformed(ActionEvent e) {
				l.setVisible(hide);
				hide = !hide;
				b.setText(hide ? "显示图片" : "隐藏图片");
			}
		});
		f.add(l);
		f.add(b);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}

效果:
点击第一次:
点击隐藏图片后:
在这里插入图片描述
就这样循环重复

6.练习2
题目:
把键盘监听中的代码完善,使得由当前的只能向右移动,完善为上下左右移动都可以。

提示:keyCode与方向的对应关系
38 上
40 下
37 左
39 右
代码如下:

package gui2;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test6 {

	public static void main(String[] args) {
		JFrame f = new JFrame("123");
		f.setSize(400,300);
		f.setLocation(580,200);
		f.setLayout(null);
		
		final JLabel l = new JLabel();
		ImageIcon i = new ImageIcon("D:/shana.png");
		l.setIcon(i);
		l.setBounds(50,50,i.getIconWidth(),i.getIconHeight());
		// 增加键盘监听
		f.addKeyListener(new KeyListener() {
			//键被按下
			@Override
			public void keyTyped(KeyEvent e) {
				
			}
			// 键被弹起
			@Override
			public void keyReleased(KeyEvent e) {
				if(e.getKeyCode() == 39) {
					l.setLocation(l.getX() + 10,l.getY());
				}
				else if(e.getKeyCode() == 38) {
					l.setLocation(l.getX(),l.getY() - 10);
				}
				else if(e.getKeyCode() == 40) {
					l.setLocation(l.getX(),l.getY() + 10);
				}
				else if(e.getKeyCode() == 37) {
					l.setLocation(l.getX() - 10,l.getY());
				}
			}
			// 一个按下弹起的组合动作
			@Override
			public void keyPressed(KeyEvent e) {
				
			}
		});
		
		f.add(l);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

}

在之前第二块的内容上增加些内容就可以了

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值