引言

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

思路

监听器

监听器概述

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

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

本项目用到的监听器

  • MouseListener:用于处理鼠标状态变化的事件,例如按下、释放、点击、进入或退出组件区域3。

  • MouseMotionListener:用于处理鼠标移动或拖动的事件。

  • ActionListener:用于处理动作事件,例如按钮按下或菜单项选择。

  • ChangeListener:用于处理状态改变事件,例如滑块移动或选项卡切换。

  • KeyListener:用于处理键盘输入的事件,例如按下、释放或输入字符。

代码实现

设计用户界面步骤

  1. 引入需要使用的Java类库和包,包括Swing和AWT相关的类库。

  1. 定义一个名为UI的公共类,继承JFrame类,并定义构造方法。

  1. 在构造方法中设置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中。

  1. 创建一个菜单栏和一个弹出式菜单,并将它们添加到JFrame中。

  1. 设置键盘和鼠标的监听器,并实现相应的监听方法。

//导入了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方法中绘制一个椭圆和一段文字。

  1. 在main方法中创建一个UI对象,启动UI界面。

  1. 总的来说,这份代码主要实现了一个基本的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"));}@Overridepublic 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的组件和各种事件监听器。

  1. 定义UIListener类,并实现各种监听器,包括ActionListener、ChangeListener、KeyListener、MouseListener和MouseMotionListener。

  1. 在每个监听器的方法中,打印出相应的事件信息,以便我们观察和调试。

  1. 在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接口,响应按钮的点击事件@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮被点击了");}//实现KeyListener接口,响应键盘按键事件@Overridepublic void keyTyped(KeyEvent e) {//获取键盘按下的键System.out.println("键盘键入");}@Overridepublic void keyPressed(KeyEvent e) {//获取按下的键keyCode和keyCharint keyCode=e.getKeyCode();char keyChar=e.getKeyChar();if(keyCode==KeyEvent.VK_SPACE){//其实这里我们的意思是如果按下的是空格键,则执行响应的操作}System.out.println ("按下键盘" + keyCode + "|" + keyChar);}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("松开按键");}@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("鼠标点击");}@Overridepublic void mousePressed(MouseEvent e) {int x = e.getX ();int y = e.getY ();//事先设置好坐标参数,如果点击了一个按钮,则执行一些操作if(x >= 100 && x <= 160 && y >= 200 && y <= 235){System.out.println ("你好按钮被点击了~");//绘制一个蓝色的圆形,实现鼠标点击之后,显示hellog.setColor (Color.BLUE);g.fillOval (100, 200, 60, 35);g.setColor (Color.WHITE);g.drawString ("hello", 120, 230);}System.out.println("鼠标按下");}
  1. 在mouseReleased()方法中,清除绘制的椭圆和文本。

  1. 在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接口,响应按钮的点击事件@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮被点击了");}//实现KeyListener接口,响应键盘按键事件@Overridepublic void keyTyped(KeyEvent e) {//获取键盘按下的键System.out.println("键盘键入");}@Overridepublic void keyPressed(KeyEvent e) {//获取按下的键keyCode和keyCharint keyCode=e.getKeyCode();char keyChar=e.getKeyChar();if(keyCode==KeyEvent.VK_SPACE){//其实这里我们的意思是如果按下的是空格键,则执行响应的操作}System.out.println ("按下键盘" + keyCode + "|" + keyChar);}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("松开按键");}@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("鼠标点击");}@Overridepublic void mousePressed(MouseEvent e) {int x = e.getX ();int y = e.getY ();//事先设置好坐标参数,如果点击了一个按钮,则执行一些操作if(x >= 100 && x <= 160 && y >= 200 && y <= 235){System.out.println ("你好按钮被点击了~");//绘制一个蓝色的圆形,实现鼠标点击之后,显示hellog.setColor (Color.BLUE);g.fillOval (100, 200, 60, 35);g.setColor (Color.WHITE);g.drawString ("hello", 120, 230);}System.out.println("鼠标按下");}@Overridepublic 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("鼠标松开");}@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("鼠标进入窗体");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("鼠标离开");}//用来实现MouseMotionListener接口,响应鼠标移动事件@Overridepublic void mouseDragged(MouseEvent e) {System.out.println("鼠标波动");}@Overridepublic void mouseMoved(MouseEvent e) {System.out.println("鼠标移动");}//实现ChangeListener接口,响应组件状态改变事件@Overridepublic 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中使用常见的几种监听器实现一种形似“水滴”的图形相关推荐

  1. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  2. java中给对象的List集合去重的几种方法(Lambda)

    java中给对象的List集合去重的几种方法 前言 一.lambda表达式的去重方式 二.Stream API中的collect去重方法 三.Stream API 中的distinct方法去重 前言 ...

  3. JAVA中的常见Bug

    作为游戏程序开发者,你的日常是这样吗? 每日常态是这样吗? 作为编程开发者那自然就要对程序中的常见的异常有一定的了解.在这里我列出几个常见的程序中的异常方便学习Java的新手进行查改 Java.lan ...

  4. java的entryset_「entryset」Java中Map的 entrySet() 详解以及用法(四种遍历map的方式) - seo实验室...

    entryset Entry 由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系. Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对 ...

  5. Java中的常见的锁及其内存语义

    文章目录 为什么会有锁? JVM内存模型 没有锁会怎么样? happens-before 先行先发生原则 Java中常见的锁 synchronized 内存语义 实现原理 volatile 内存语义 ...

  6. Java中的深克隆和浅克隆的原理及三种方式实现深克隆

      本文详细介绍了Java中的浅克隆和深克隆的概念,及案例演示如何实现深克隆! 文章目录 1 克隆概述 2 深克隆实现 3 案例 3.1 测试普通clone方法--浅克隆 3.2 使用重写后的clon ...

  7. Java中Map的 entrySet() 详解以及用法(四种遍历map的方式)

    Entry 由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系.  Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对 ...

  8. Java中数组常见的几种排序方法!

    数组的定义: int[] arr = new int[5];int[] arr1 = {1,2,3,4,5};long[] arr2 = new long[6];String[] strs = new ...

  9. 坑你没商量!盘点Java中最常见的事故现场,你都中过哪些招?

    来源 | https://www.cnblogs.com/wyq178/p/13520745.html 前言 JDK作为我们每天必备的调用类库,里面大量提供了基础类供我们使用.可以说离开jdk,我们的 ...

最新文章

  1. 关于View测量中的onMeasure函数
  2. php 正则表达式 ies,正则表达式模式修正符(/ies)
  3. boost::replace_if相关的测试程序
  4. Manacher 最长回文子串
  5. es6 数组合并_13个不low的JS数组操作,你需要知道一下
  6. nginx绑定IP的坑
  7. QQ 小程序来了,怎么做?
  8. day02.2-常用Linux命令整理
  9. 【原创】flv文件的三种下载方法
  10. C语言结构体实例演示
  11. 使用bat脚本创建快捷方式
  12. 可视化工具Netron介绍
  13. android录制视频设置分辨率,Android录制视频的全面屏适配
  14. MATLAB 线性动态范围调整
  15. 小网站云服务器配置推荐,小网站云服务器配置推荐
  16. asp.net旅游网站系统VS开发sqlserver数据库web结构c#编程计算机网页项目
  17. 如何彻底删除小黑记事本弹窗
  18. 60 个 Python 小例子
  19. 马云:大数据时代_最重要的是做最好的自己
  20. m1 Mac zshrc 环境变量

热门文章

  1. 美团一面-电话面试-20180320下午
  2. 【Java核心技术阅读笔记】第三章 Java的基本程序设计结构
  3. 对话尼基·帕玛:在Google Brain工作是一种怎样的体验?
  4. 使用Python编写程序进行疫情健康报备
  5. 原神壁纸大全|那些你所需要的原神壁纸!
  6. 深入浅出Pytorch函数——torch.exp
  7. 2014策马奔腾(2),日新月异
  8. JavaBean简单应用,输入三边长判断能否构成三角形并输出三角形面积
  9. 6月城市之星领跑活动获奖名单已出炉
  10. [轻笔记]各种GAN