引言

首先,这篇文章的主要是通过使用界面设计,以及几种监听器来实现用户在界面上点击按钮,点击顶部菜单栏能够展开,滑动滚轮对一个圆形实现颜色、大小、位置的变化,产生一种形似“水滴”的图形。

思路




java 监听UPDATE操作 java监听类_java


监听器

监听器概述

监听器是一种用于监听和处理其他对象的事件或状态变化的对象,其实也可以说监听器是一种特殊的对象。事件是用户与程序之间的交互,例如鼠标点击、键盘输入、按钮按下等。监听器需要实现特定的接口,并注册到事件源上,才能响应事件。当事件发生时,事件源会通知监听器,并传递一个事件对象,包含了事件的相关信息和方法。

如果用一个通俗易懂的例子来解释监听器,其实可以这样理解。我们可以把监听器想象成一个警察,它的任务是监视某个地方(事件源)是否发生了什么事情(事件)。如果发生了,它就会立刻过去处理(调用监听器的方法)。为了让警察知道哪里需要监视,我们需要给它一个任务单(注册监听器)。当事情发生时,您还需要给警察一些线索(事件对象),让它知道事情的详情和如何处理。随着写代码的不断深入,我们会慢慢加深对监听器的理解。

本项目用到的监听器

  • MouseListener:用于处理鼠标状态变化的事件,例如按下、释放、点击、进入或退出组件区域3。
  • MouseMotionListener:用于处理鼠标移动或拖动的事件。
  • ActionListener:用于处理动作事件,例如按钮按下或菜单项选择。
  • ChangeListener:用于处理状态改变事件,例如滑块移动或选项卡切换。
  • KeyListener:用于处理键盘输入的事件,例如按下、释放或输入字符。

代码实现

设计用户界面步骤

  1. 引入需要使用的Java类库和包,包括Swing和AWT相关的类库。
  2. 定义一个名为UI的公共类,继承JFrame类,并定义构造方法。
  3. 在构造方法中设置JFrame的各项属性,包括标题、大小、布局方式等。
//导入了javax.swing包中的所有类
import javax.swing.*;
import java.awt.*;

//定义了一个名为UI的公共类,并继承了JFrame类
public class UI extends JFrame {

    //定义UI类的构造方法,这个方法在创建UI对象时被调用
    public UI(){
        //创建JFrame对象
        JFrame jf=this;
        //设置JFrame的属性
        jf.setTitle("监听器");
        jf.setSize(1500,900);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(new FlowLayout());//设置关闭按钮的操作为退出程序,并且使用流式布局来排列组件
  1. 创建两个按钮和一个滑杆,并将它们添加到JFrame中。
  2. 创建一个菜单栏和一个弹出式菜单,并将它们添加到JFrame中。
  3. 设置键盘和鼠标的监听器,并实现相应的监听方法。
//导入了javax.swing包中的所有类
import javax.swing.*;
import java.awt.*;

//定义了一个名为UI的公共类,并继承了JFrame类
public class UI extends JFrame {

    //定义UI类的构造方法,这个方法在创建UI对象时被调用
    public UI(){
        //创建JFrame对象
        JFrame jf=this;
        //设置JFrame的属性
        jf.setTitle("监听器");
        jf.setSize(1500,900);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(new FlowLayout());//设置关闭按钮的操作为退出程序,并且使用流式布局来排列组件

        //创建两个按钮,并将其添加到JFrame中,能够实现用户可以看到,可以点击它
        JButton btn1=new JButton("登录");
        jf.add(btn1);
        JButton btn2=new JButton("注册");
        jf.add(btn2);

        //设置滑杆对象,范围为0-255,并添加到JFrame对象中
        JSlider slider=new JSlider(0,255);
        jf.add(slider);

        //设置界面菜单,即JMenuBar对象
        JMenuBar menuBar=new JMenuBar();
        //设置两个菜单栏选项,命名为文件和编辑,并分别设置其菜单项
        JMenu jmu1=new JMenu("文件");
        JMenu jmu2=new JMenu("编辑");
        JMenuItem jmi1=new JMenuItem("创建文件");
        JMenuItem jmi2=new JMenuItem("全选");
        menuBar.add(jmu1);
        menuBar.add(jmu2);
        jmu1.add(jmi1);
        jmu2.add(jmi2);

        //创建JPopupMenu 对象
        JPopupMenu jpopupMenu=new JPopupMenu();
        jf.setJMenuBar(menuBar);
        inipomnu();
        JPanel jp=new JPanel();
        jp.setComponentPopupMenu(jpopupMenu);
        jp.setPreferredSize(new Dimension(100,200));
        jf.add(jp);
        jf.setVisible(true);

        //设置JFrame可以获取焦点
        jf.setFocusable(true);

        //创建UIListener对象,并为各种组件添加监听器
        UIListener uil = new UIListener ();
        jf.addMouseListener (uil);
        jf.addMouseMotionListener (uil);
        jf.addKeyListener (uil);
        btn1.addActionListener (uil);
        btn2.addActionListener (uil);
        jmi1.addActionListener (uil);
        slider.addChangeListener (uil);
        //设置Graphics对象
        uil.g=jf.getGraphics();
    }
    //初始化JPopupMenu 对象
    JPopupMenu jPopupMenu=new JPopupMenu();
    public void inipomnu(){
        JMenu jMenu=new JMenu("菜单1");
        jPopupMenu.add(new JMenuItem(":菜单项"));
        jPopupMenu.add (jMenu);
        jPopupMenu.add (new JMenu ("菜单2"));
        jPopupMenu.add (new JMenuItem ("菜单3"));
        jPopupMenu.add (new JMenuItem ("菜单4"));
        jPopupMenu.add (new JMenuItem ("菜单5"));
    }
  1. 在继承的paint方法中绘制一个椭圆和一段文字。
  2. 在main方法中创建一个UI对象,启动UI界面。
  3. 总的来说,这份代码主要实现了一个基本的Java UI界面,包括常见的组件和事件监听器,并在界面中绘制了一些基本的图形元素。
//导入了javax.swing包中的所有类
import javax.swing.*;
import java.awt.*;

//定义了一个名为UI的公共类,并继承了JFrame类
public class UI extends JFrame {

    //定义UI类的构造方法,这个方法在创建UI对象时被调用
    public UI(){
        //创建JFrame对象
        JFrame jf=this;
        //设置JFrame的属性
        jf.setTitle("监听器");
        jf.setSize(1500,900);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(new FlowLayout());//设置关闭按钮的操作为退出程序,并且使用流式布局来排列组件

        //创建两个按钮,并将其添加到JFrame中,能够实现用户可以看到,可以点击它
        JButton btn1=new JButton("登录");
        jf.add(btn1);
        JButton btn2=new JButton("注册");
        jf.add(btn2);

        //设置滑杆对象,范围为0-255,并添加到JFrame对象中
        JSlider slider=new JSlider(0,255);
        jf.add(slider);

        //设置界面菜单,即JMenuBar对象
        JMenuBar menuBar=new JMenuBar();
        //设置两个菜单栏选项,命名为文件和编辑,并分别设置其菜单项
        JMenu jmu1=new JMenu("文件");
        JMenu jmu2=new JMenu("编辑");
        JMenuItem jmi1=new JMenuItem("创建文件");
        JMenuItem jmi2=new JMenuItem("全选");
        menuBar.add(jmu1);
        menuBar.add(jmu2);
        jmu1.add(jmi1);
        jmu2.add(jmi2);

        //创建JPopupMenu 对象
        JPopupMenu jpopupMenu=new JPopupMenu();
        jf.setJMenuBar(menuBar);
        inipomnu();
        JPanel jp=new JPanel();
        jp.setComponentPopupMenu(jpopupMenu);
        jp.setPreferredSize(new Dimension(100,200));
        jf.add(jp);
        jf.setVisible(true);

        //设置JFrame可以获取焦点
        jf.setFocusable(true);

        //创建UIListener对象,并为各种组件添加监听器
        UIListener uil = new UIListener ();
        jf.addMouseListener (uil);
        jf.addMouseMotionListener (uil);
        jf.addKeyListener (uil);
        btn1.addActionListener (uil);
        btn2.addActionListener (uil);
        jmi1.addActionListener (uil);
        slider.addChangeListener (uil);
        //设置Graphics对象
        uil.g=jf.getGraphics();
    }
    //初始化JPopupMenu 对象
    JPopupMenu jPopupMenu=new JPopupMenu();
    public void inipomnu(){
        JMenu jMenu=new JMenu("菜单1");
        jPopupMenu.add(new JMenuItem(":菜单项"));
        jPopupMenu.add (jMenu);
        jPopupMenu.add (new JMenu ("菜单2"));
        jPopupMenu.add (new JMenuItem ("菜单3"));
        jPopupMenu.add (new JMenuItem ("菜单4"));
        jPopupMenu.add (new JMenuItem ("菜单5"));
    }
    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(100,200,60,35);
        g.drawString("hello",120,230);
    }
    public static void main(String[] args){
        new UI();
    }
}

监听器代码部分步骤

这份代码定义了一个名为UIListener的Java类,它实现了多个Swing事件监听器接口,包括MouseListener、MouseMotionListener、ActionListener、ChangeListener和KeyListener。在每个事件处理器方法中,代码打印一条相应的信息以表示事件已被触发,并执行相应的操作。

  1. 导入必要的包,包括Java Swing的组件和各种事件监听器。
  2. 定义UIListener类,并实现各种监听器,包括ActionListener、ChangeListener、KeyListener、MouseListener和MouseMotionListener。
  3. 在每个监听器的方法中,打印出相应的事件信息,以便我们观察和调试。
  4. 在mousePressed()和mouseReleased()方法中,如果鼠标点击的位置在指定的按钮范围内,就会输出"你好按钮被点击了~",并且在按钮上绘制一个蓝色的椭圆,并在椭圆上显示"hello"。
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
//列出我们要实现的各种监听器
public class UIListener implements MouseListener,MouseMotionListener,ActionListener,ChangeListener,KeyListener {
    //定义一个Graphics变量,用于在某些方法中绘制图形
    Graphics g;
    //实现ActionListener接口,响应按钮的点击事件
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按钮被点击了");
    }
    //实现KeyListener接口,响应键盘按键事件
    @Override
    public void keyTyped(KeyEvent e) {
        //获取键盘按下的键
        System.out.println("键盘键入");
    }
    @Override
    public void keyPressed(KeyEvent e) {
        //获取按下的键keyCode和keyChar
        int keyCode=e.getKeyCode();
        char keyChar=e.getKeyChar();
        if(keyCode==KeyEvent.VK_SPACE){
            //其实这里我们的意思是如果按下的是空格键,则执行响应的操作
        }
        System.out.println ("按下键盘" + keyCode + "|" + keyChar);
    }
    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("松开按键");
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("鼠标点击");
    }
    @Override
    public void mousePressed(MouseEvent e) {
        int x = e.getX ();
        int y = e.getY ();
        //事先设置好坐标参数,如果点击了一个按钮,则执行一些操作
        if(x >= 100 && x <= 160 && y >= 200 && y <= 235){
            System.out.println ("你好按钮被点击了~");
            //绘制一个蓝色的圆形,实现鼠标点击之后,显示hello
            g.setColor (Color.BLUE);
            g.fillOval (100, 200, 60, 35);
            g.setColor (Color.WHITE);
            g.drawString ("hello", 120, 230);
        }
        System.out.println("鼠标按下");
    }
  1. 在mouseReleased()方法中,清除绘制的椭圆和文本。
  2. 在stateChanged()方法中,获取JSlider对象的值,输出状态改变信息,并且使用该值设置绘图环境的颜色,绘制一个椭圆。
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
//列出我们要实现的各种监听器
public class UIListener implements MouseListener,MouseMotionListener,ActionListener,ChangeListener,KeyListener {
    //定义一个Graphics变量,用于在某些方法中绘制图形
    Graphics g;
    //实现ActionListener接口,响应按钮的点击事件
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按钮被点击了");
    }
    //实现KeyListener接口,响应键盘按键事件
    @Override
    public void keyTyped(KeyEvent e) {
        //获取键盘按下的键
        System.out.println("键盘键入");
    }
    @Override
    public void keyPressed(KeyEvent e) {
        //获取按下的键keyCode和keyChar
        int keyCode=e.getKeyCode();
        char keyChar=e.getKeyChar();
        if(keyCode==KeyEvent.VK_SPACE){
            //其实这里我们的意思是如果按下的是空格键,则执行响应的操作
        }
        System.out.println ("按下键盘" + keyCode + "|" + keyChar);
    }
    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("松开按键");
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("鼠标点击");
    }
    @Override
    public void mousePressed(MouseEvent e) {
        int x = e.getX ();
        int y = e.getY ();
        //事先设置好坐标参数,如果点击了一个按钮,则执行一些操作
        if(x >= 100 && x <= 160 && y >= 200 && y <= 235){
            System.out.println ("你好按钮被点击了~");
            //绘制一个蓝色的圆形,实现鼠标点击之后,显示hello
            g.setColor (Color.BLUE);
            g.fillOval (100, 200, 60, 35);
            g.setColor (Color.WHITE);
            g.drawString ("hello", 120, 230);
        }
        System.out.println("鼠标按下");
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        //清除之前绘制的圆形和文本
        g.setColor (Color.BLACK);
        g.fillOval (100, 200, 60, 35);
        g.setColor (Color.WHITE);
        g.drawString ("你好", 120, 230);
        System.out.println("鼠标松开");
    }
    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("鼠标进入窗体");
    }
    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("鼠标离开");
    }
    //用来实现MouseMotionListener接口,响应鼠标移动事件
    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println("鼠标波动");
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("鼠标移动");
    }
    //实现ChangeListener接口,响应组件状态改变事件
    @Override
    public void stateChanged(ChangeEvent e) {
        JSlider jsl = (JSlider) e.getSource ();
        System.out.println (jsl.getValue ());
        System.out.println ("组件状态改变");
        g.setColor (new Color (jsl.getValue (), jsl.getValue (), jsl.getValue ()));
        g.fillOval (300 + jsl.getValue (), 200, jsl.getValue () * 2, jsl.getValue () * 2);
        System.out.println("组件状态改变");
    }
}

效果


java 监听UPDATE操作 java监听类_ide_02


总结和拓展

总而言之,监听器我们应该把它当成工具,使用监听器的过程是一种编程模式,用以实现我们需求的功能。其实利用好监听器还可以做很多事情

  • 监听用户在界面上的操作,比如点击按钮、输入文字、选择菜单等,然后执行相应的逻辑。
  • 监听程序中的数据或状态的变化,比如读取、处理、写入数据等,然后记录日志、显示进度、处理异常等。
  • 监听其他程序或设备的事件,比如收到邮件、短信、电话等,然后提醒用户、回复消息、拒绝来电等。