Advertisement

swing中的事件监听

阅读量:

按钮监听
创建一个匿名类,并使其实现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 类。
当 key_pressed 被调用时代表按键被按下。
当 key_released 被调用时代表按键被弹起。
当 key_typed 被调用时表示按键按压后释放的动作。
通过 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);
    	}
    
    }

实际上增加键盘监听即是对KEYBOARD Listeners进行操作结果:按下右侧箭头图片会向右滚动

在本例中,我们采用了鼠标监听器技术。具体来说,当鼠标释放时,系统会调用相应的处理逻辑;当鼠标按下时,执行特定操作;而当鼠标退出或点击时,则完成相应的任务。在这一过程中,我们特别采用了 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中存在许多未被实际使用的功能。例如:mouseup事件、mousedown事件和mouseleave事件等。这时就可以采用鼠标监听适配器(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);
    	}
    }

效果:

点击第一次:

点击隐藏图片后:

在这里插入图片描述

就这样循环重复

对键盘监听相关的代码进行优化以实现仅允许向右移动的功能 支持上 下 左 右四个方向的移动操作

提示: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);
    	}
    
    }

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

全部评论 (0)

还没有任何评论哟~