目录

  • 1. 监听器-MouseListener(鼠标监听器):
  • 2. 监听器-MouseMotionListener(鼠标运动监听器):
  • 3. 事件类MouseEvent:
    • 链接:JDK文档
    • 3.1 getXOnScreen()、getYOnScreen()、getLocationOnScreen():
      • 3.1.1 示例:输出鼠标指针的绝对坐标:
    • 3.2 getX()、getY()、getPoint():
    • 3.3 getClickCount():
      • 3.3.1 示例:检测单击还是双击:
    • 3.4 getButton():
      • 3.4.1 示例:检测按下的是什么键:
    • 3.5 getWhen():
      • 3.5.1 示例:输出事件所发生时的时间(不同格式)
    • 3.6 paramString():
    • 3.7 getModifiers()、静态方法getMouseModifiersText():
    • 3.8 getModifiersEx()、静态方法getModifiersExText():
    • 3.9 getID():
      • 3.9.1 示例:用Switch语句将常量转化为字符串
    • 3.10 getSource():
      • 3.10.1 示例:输出点击的按钮名称
  • 4. 示例
    • 4.1 在一个JLabel中显示一个JButton的状态
    • 4.2 在一个JLabel中显示鼠标相对于JFrame的坐标
    • 4.3 为JButton做一个简单的日志
  • 5. 适配器
    • 5.1 MouseListener、MouseMotionListener监听器的适配器
  • 6. 注脚

1. 监听器-MouseListener(鼠标监听器):

用addMouseListener()添加、removeMouseListener()删除此监听器1
MouseListener监听器是监听鼠标对添加了此监听器的组件进行的操作的,共有以下5个方法:

public void mouseClicked(MouseEvent e);  //鼠标点击(左、中、右键和单、双击均可触发)
public void mousePressed(MouseEvent e); //鼠标按下(左、中、右键均可触发)
public void mouseReleased(MouseEvent e);//鼠标松开public void mouseEntered(MouseEvent e);   //鼠标浮动
public void mouseExited(MouseEvent e);  //鼠标离开

“鼠标浮动”指的是鼠标移动到组件上没有点击的时候,严肃点应该叫“进入”,但我个人感觉“浮动”更有趣
注意: 发生鼠标点击事件时,将会依次触发以下方法:
mousePressed(鼠标按下) ——> mouseReleased(鼠标松开) -> mouseClicked(按下并释放构成整体,总结为鼠标点击)
当只有mousePressed(鼠标按下)而没有mouseReleased(鼠标松开)时,不构成mouseClicked(鼠标点击),如把鼠标在按钮上按住然后移开鼠标再松开。与之相对应的情况则没有反应——即,在其他地方按下鼠标然后移到按钮上松开是不构成mouseReleased(鼠标松开)的。(第一种情况只构成mousePressed,第二种情况无触发事件)

2. 监听器-MouseMotionListener(鼠标运动监听器):

用addMouseMotionListener()添加、removeMouseMotionListener()删除此监听器1
尽管MouseMotionListener也是个监听器,但Java并没有提供“MouseMotionEvent”这样的事件,所以MouseListener和MouseMotionListener都是用的MouseEvent

public void mouseDragged(MouseEvent e);  //鼠标拖动
public void mouseMoved(MouseEvent e);   //鼠标移动(不包含拖动,即拖动时不触发移动事件)

在添加了此监听器的组件上拖动(或移动)才会触发,也就是鼠标在其他地方乱晃(或是按着乱晃)不会触发

3. 事件类MouseEvent:

链接:JDK文档

没找到想看内容或看不懂的看这里(因为我之前为了找JDK文档花了几乎一下午,这里贴给大家感觉应该有用):
JDK-8离线文档
JDK-17(个人在用)-在线文档
JDK-17-离线文档
JDK-11-在线文档
JDK-11-离线文档

3.1 getXOnScreen()、getYOnScreen()、getLocationOnScreen():

public int getXOnScreen();//返回鼠标指针的绝对X坐标(相对于全局(屏幕)的X坐标)
public int getYOnScreen();//返回鼠标指针的绝对Y坐标
public Point getLocationOnScreen();//返回鼠标指针的绝对坐标

3.1.1 示例:输出鼠标指针的绝对坐标:

System.out.println(e.getLocationOnScreen().toString());//使用getLocationOnScreen()
System.out.println("[x=" + e.getXOnScreen() + ",y=" + e.getYOnScreen() + "]");//使用getXOnscreen()和getYOnScreen()
System.out.printf("[x=%d,y=%d]\n", e.getXOnScreen(), e.getYOnScreen());//使用printf,同样使用getXOnScreen()和getYOnScreen()

3.2 getX()、getY()、getPoint():

public int getX();//返回鼠标指针相对于点击元素(DOM)的X坐标
public int getY();//返回鼠标指针相对于点击元素(DOM)的Y坐标
public Point getPoint();//返回鼠标指针相对于点击元素(DOM)的坐标

点击元素(DOM)就是指添加了此监听器的组件
用法及示例同上一节,这3个方法与上一节的区别就是一个是绝对坐标,一个是相对于本组件的坐标

3.3 getClickCount():

用于点击事件:

public int getClickCount();//返回点击的次数(不局限于1~2)

按下不同键不构成双击(即,当按下与上一次不同的鼠标按键时,内部变量clickCount被赋值为0),如,按顺序快速点击左键与右键,则两次都返回1
众所周知,构成双击需要快速点击同一个键两次。且实际上如果把这两次点击事件都getClickCount一下就会发现,第一次getClickCount()的值为1,第二次就为2;如果点击3次,则getClickCount()就分别为1,2,3,这证明了getClickCount()不仅只返回0,1和2的值,继续点击则会达到更高,所以如果用下面的示例测试一下就会发现,由于示例只检测了1和2的情况,所以如果getClickCount()的值达到更高则没有任何输出

3.3.1 示例:检测单击还是双击:

用If-else语句:

if (e.getClickCount() == 1)System.out.println("鼠标单击");
else if (e.getClickCount() == 2)System.out.println("鼠标双击");

或是用Switch语句:

switch (e.getClickCount()) {case 1:System.out.println("鼠标单击");break;case 2:System.out.println("鼠标双击");break;
}

以上这两个示例实际上存在一定问题,也就是上文提到的,如果getClickCount() > 2,则没有任何反应

3.4 getButton():

用于点击(或按下)事件:

public int getButton();//返回触发事件的鼠标按钮(常量)
//鼠标按钮常量(MouseEvent中):
public static final int NOBUTTON = 0;  //没有按下鼠标按键(例如鼠标浮动、离开等事件)
public static final int BUTTON1 = 1;   //鼠标左键
public static final int BUTTON2 = 2;   //鼠标中键
public static final int BUTTON3 = 3;   //鼠标右键

鼠标中键其实就是滚轮(按下滚轮)
如果你的鼠标有三个以上的按钮,则没有对应的常量,只会直接返回整数。如你的鼠标有5个按钮,则可能返回以下数值:

数值 对应常量 鼠标按键
0 NOBUTTON (无)
1 BUTTON1 左键
2 BUTTON2 中键
3 BUTTON3 右键
4 (无) (第4个按键)
5 (无) (第5个按键)

3.4.1 示例:检测按下的是什么键:

用If-else语句:

if (e.getButton() == MonseEvent.BUTTON1)System.out.println("鼠标左键");
else if (e.getButton() == MonseEvent.BUTTON2)System.out.println("鼠标中键");
else if (e.getButton() == MonseEvent.BUTTON3)System.out.println("鼠标右键");

或是用Switch语句:

switch (e.getButton()){case MouseEvent.BUTTON1:System.out.println("鼠标左键");break;case MouseEvent.BUTTON2:System.out.println("鼠标中键");break;case MouseEvent.BUTTON3:System.out.println("鼠标右键");break;
}

如果你的鼠标比较特殊,有更多按键,则以上事例不够全面,可以给If-else语句加上最后一个else,Switch语句加一个default

3.5 getWhen():

顾名思义,作用为返回事件所发生的时间,是UTC(协调世界时)时间

public long getWhen(); //返回事件发生时的时间戳(1970年1月1日00:00至今的毫秒数)

3.5.1 示例:输出事件所发生时的时间(不同格式)

由于getWhen()所返回的是1970年至今的毫秒数,一般需要经过处理再打印出来,所以平时可以用java.util.Date类进行快捷地处理,如果想还可以用SimpleDateFormat类更细致地进行处理:

import java.util.Date; //Date类的构造器中有一个是直接接受1970年至今的毫秒数(long),和 getWhen()所返回的刚好吻合
import java.text.SimpleDateFormat; //可以使用SimpleDateFormat进行更细致的时间格式化字符串System.out.println( e.getWhen() ); //直接打印未经处理的毫秒数//使用Date类:
System.out.println( new Date(e.getWhen()) ); //使用Date默认的方式格式化,println()会自动调用Date类的toString()方法//使用SimpleDateFormat进行更细致的格式化:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println( sdf.format(new Date(e.getWhen())) );//使用printf()方法:
System.out.printf("%tc", new Date(e.getWhen()));

还可以用从C语言搬过来的printf()方法,它对Date类也提供支持,只要使用时间占位符 %t,范例中的c表示格式化方式,可以替换为其他方式,更多方式可以自己去查百度之类的

3.6 paramString():

返回标识此事件的参数字符串,此方法对于事件日志记录和调试很有用

//示例输出:
MOUSE_PRESSED,(52,93),absolute(59,163),button=1,modifiers=Ctrl+Button1,extModifiers=Ctrl,clickCount=2

输出介绍:

  1. 首先输出触发的事件类型。如示例中我把此方法在 mousePressed 中调用,输出为 MOUSE_PRESSED,详情看3.9节
  2. 其次为触发事件时鼠标相对于此组件的坐标。如示例中为 (52,163),前一个数为X轴(左右),后一个Y轴(上下)。和上文3.2中介绍的方法作用相同
  3. 然后是触发事件时鼠标的绝对坐标,即相对于屏幕的坐标。输出与第2条不同的是,前面跟一个"absolute"单词,意为"完全的",其次也是(X轴,Y轴)。与上文3.1中介绍的方法作用相同
  4. <有时没有> “button=?”,指触发事件所用的鼠标按钮是哪个,示例用的是左键(1),与上文3.4介绍的getButton()返回的值相同
  5. <有时没有> “modifiers=?”,指触发事件时的修饰符,与接下来将在3.7介绍的方法作用相同。如范例中我按住Ctrl键用左键按下按钮,输出"Ctrl+Button1"
  6. <有时没有> “extModifiers=?”,指触发事件时鼠标按钮所带的修饰符,与接下来将在3.8介绍的方法作用相同。如范例中我按住Ctrl键用左键按下按钮,输出"Ctrl+Button1"
  7. “clickCount=?”,指点击次数,与上文3.3中介绍的方法作用相同

…如有遗漏欢迎补充

3.7 getModifiers()、静态方法getMouseModifiersText():

其实getModifiers()方法已被打上Deprecated注解,不提倡使用,更提倡用下一节介绍的getModifiersEx()方法,但上文有所提及,所以简单介绍一下
getModifiers()方法返回事件的修饰符,常量在InputEvent中定义,用常见的位或(|) 方式结合。如我按住Ctrl键用左键触发事件,返回的修饰符如下:

e.getModifiers() == InputEvent.CTRL_MASK | InputEvent.BUTTON1_MASK;

之所以被废除,个人猜测是因为有些奇怪的BUG(特性?)

//如我按下鼠标中键,它返回这个:
InputEvent.ALT_MASK | InputEvent.BUTTON2_MASK //可实际上我并没有按Alt

再说说getMouseModifiersText():

public static String getMouseModifiersText(int modifiers); //将getModifiers()返回的修饰符翻译成字符串
//比如这个:
InputEvent.CTRL_MASK | InputEvent.BUTTON1_MASK
//它翻译为:
"Ctrl+Button1" //(实际上没有双引号)

3.8 getModifiersEx()、静态方法getModifiersExText():

静态方法getModifiersExText()在InputEvent类中定义
上一节(3.7)中getModifiers()和getMouseModifiersText()的合适替代品,更提倡用这个
上一节所使用的常量为XXX_MASK,这节所介绍的方法所使用的常量为XXX_DOWN_MASK
getModifiersEx()同样有一些奇怪的BUG(特性?),我把它分为2种情况(在我的台式机上测试):
一、BUG(特性?)发作,不仅是上一节中介绍的凭空多出按键,而且直接忽略鼠标按钮,还是上一节中的范例:

//我按下鼠标中键:
InputEvent.BUTTON2_DOWN_MASK //我认为它应该返回这个
InputEvent.ALT_DOWN_MASK //结果事实让我震惊了(它先凭空生成了一个Alt,然后又把Button2给忽略掉了)

二、奇奇怪怪的修饰符也不加了,按钮也不忽略了。按下哪个就返回哪个,总之就突然恢复正常了,如:

//我按下 Ctrl + Alt + 左键,它正常返回:
InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.BUTTON1_DOWN_MASK

就挺玄学的,我在不同事件中测试,结果如下:

监听器 事件 状态
MouseListener mousePressed 正常返回
MouseListener mouseReleased 离谱特性
MouseListener mouseClicked 离谱特性
MouseMotionListener mouseDragged 正常返回

其他事件则没有监听鼠标点击
至于getModifiersExText()则和上一节中的getMouseModifiers()作用相同。但getModifiersExText()用的是XXX_DOWN_MASK,getModifiersText()用的XXX_MASK,所以不能混起来用,上一节中的两个方法配套使用,这一节的两个方法也只能配套使用

3.9 getID():

返回触发的事件的常量(int),用于编写静态方法(工具)时使用,可用的常量如下:

常量名称 事件
MOUSE_PRESSED mousePressed(鼠标按下) 501
MOUSE_RELEASED mouseReleased(鼠标松开) 502
MOUSE_CLICKED mouseClicked(鼠标点击) 500
MOUSE_ENTERED mouseEntered(鼠标浮动) 504
MOUSE_EXITED mouseExited(鼠标离开) 505
MOUSE_MOVED mouseMoved(鼠标移动) 503
MOUSE_DRAGGED mouseDragged(鼠标拖动) 506

还有一个较为特殊,这个是属于MouseWheelListener(鼠标滚轮监听器)的:

常量名称 事件
MOUSE_WHEEL mouseWheelMoved(鼠标滚轮移动) 507

3.9.1 示例:用Switch语句将常量转化为字符串

常量的值是整数(int),要转化为字符串,除了使用Java机制-反射获取常量名,只能用Switch语句(或if-else)一个一个检测:

import static java.awt.event.MouseEvent.*; //后面懒得写全称可以用静态导入一次全导入进来public static String getEventName(final int id) throws IllegalArgumentException {switch (id) {case MOUSE_PRESSED:return "MOUSE_PRESSED";case MOUSE_RELEASED:return "MOUSE_RELEASED";case MOUSE_CLICKED:return "MOUSE_CLICKED";case MOUSE_ENTERED:return "MOUSE_ENTERED";case MOUSE_EXITED:return "MOUSE_EXITED";case MOUSE_MOVED:return "MOUSE_MOVED";case MOUSE_DRAGGED:return "MOUSE_DRAGGED";case MOUSE_WHEEL:return "MOUSE_WHEEL";default:throw new IllegalArgumentException("The id doesn't exist.");}
}

其实用反射获取常量名的开销要比用switch或if-else要高,所以这里就不贴代码了,感兴趣可以自己搓一篇出来

3.10 getSource():

此方法返回触发事件的对象,返回类型为Object,所以需要进行显式的向下转型

public Object getSource(); //返回触发事件的对象

常用于不同按钮添加同一个监听器对象,还有自己的静态方法(工具)中使用

3.10.1 示例:输出点击的按钮名称

就是上面说的不同按钮添加同一个监听器对象

public void main(String[] args) {JButton button1 = new JButton("Button-1"), //创建不同的按钮button2 = new JButton("Button-2");MouseListener ml = new MouseAdapter() //创建监听器对象。由于只实现了一个mouseClicked方法,使用将在第5.1节中介绍的鼠标适配器@Override //用适配器由于不是接口,最好顺手一个Override防止方法签名写错public void mouseClicked(MouseEvent e) {String buttonName = ((JButton) e.getSource()).getText(); //利用getSource获取触发的按钮对象,需向下转型System.out.println( "Clicked button: " + buttonName ); //输出按钮名}};button1.addMouseListener(ml); //添加监听器button2.addMouseListener(ml); //添加监听器//与本章内容无关,方便测试:JFrame frame = new JFrame("示例-3.10.1"); //创建窗口frame.setSize(240, 180);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLayout(new GridLayout(1, 2)); //设置布局管理器,这里用网格管理器frame.add(button1); //添加按钮1frame.add(button2); //添加按钮2frame.setVisible(true); //显示窗口
}

4. 示例

4.1 在一个JLabel中显示一个JButton的状态

没有写得很好,甚至在clickCount只检测1和2:

//只有添加监听器的代码,没有JFrame那一部分:
public static void main(String[] args) {JButton button = new JButton("Button");//创建按钮JLabel label = new JLabel("按钮状态:" + "静止");//显示button的状态button.addMouseListener(new MouseListener() { //使用匿名类添加MouseListener监听器public void mouseClicked(MouseEvent e) { //鼠标点击String str = "";if (e.getButton() == MouseEvent.BUTTON1)//检测按下的是什么键,也可以用Switch语句(见上)str = "左键";else if (e.getButton() == MouseEvent.BUTTON2)str = "中键";else if (e.getButton() == MouseEvent.BUTTON3)str = "右键";else str = "Button_" + e.getButton();if (e.getClickCount() == 1)//检测单击还是双击str += " 单击";else if (e.getClickCount() == 2)str += " 双击";label.setText("按钮状态:" + str);}public void mousePressed(MouseEvent e) {    //鼠标按下if (e.getButton() == MouseEvent.BUTTON1)//按下的是哪个键(也可以用Switch语句)label.setText("按钮状态:" + "左键按下");else if (e.getButton() == MouseEvent.BUTTON2)label.setText("按钮状态:" + "中键按下");else if (e.getButton() == MouseEvent.BUTTON3)label.setText("按钮状态:" + "右键按下");else label.setText("按钮状态:Button_" + e.getButton() + " pressed";}public void mouseReleased(MouseEvent e) {   //鼠标松开label.setText("按钮状态:" + "静止");}public void mouseEntered(MouseEvent e) {   //鼠标浮动(鼠标移动到组件上没有点击的时候)label.setText("按钮状态:" + "鼠标浮动");}public void mouseExited(MouseEvent e) {       //鼠标离开label.setText("按钮状态:" + "静止");}});//TODO:写JFrame的位置,也可以把下面那一段直接贴在这里
}

感觉还是把JFrame那一段贴出来比较方便测试:

//这一段接在main方法的末尾:JFrame frame = new JFrame("示例4.1");//创建窗口frame.setSize(240, 80);//设置大小frame.setLayout(new GridLayout(1, 2));  //设置布局管理器,这里用的GridLayoutframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(button);//添加按钮frame.add(label);//添加显示状态用的那个JLabelframe.setVisible(true);//显示窗口

4.2 在一个JLabel中显示鼠标相对于JFrame的坐标

这是MouseMotionListener监听器的示例:

public static void main(String[] args) {JFrame frame = new JFrame("示例4.2");//创建窗口JLabel jl_x = new JLabel(),//显示鼠标X坐标jl_y = new JLabel();//显示鼠标Y坐标frame.addMouseMotionListener(new MouseMotionListener() {//为窗口添加MouseMotionListener监听器public void mouseMoved(MouseEvent e) {   //鼠标移动jl_x.setText("X坐标=" + e.getX());  //显示鼠标X坐标jl_y.setText("Y坐标=" + e.getY());   //显示鼠标Y坐标}public void mouseDragged(MouseEvent e) {//鼠标拖动jl_x.setText("X坐标=" + e.getX());    //显示鼠标X坐标jl_y.setText("Y坐标=" + e.getY());   //显示鼠标Y坐标}});//下面这些和文章内容无关,可以不看,直接跳过:frame.setSize(240, 180);//设置大小frame.setLayout(new GridLayout(1, 2));  //设置布局管理器,这里用的网格布局管理器frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(jl_x);//添加显示X坐标的JLabelframe.add(jl_y);//添加显示Y坐标的JLabelframe.setVisible(true);//显示窗口
}

4.3 为JButton做一个简单的日志

运用了第3节中大部分方法,这里用+连接字符串,更推荐用String.format()

import nighramet.util.MouseConst; //3.9.2中的工具/*** 根据参数生成一个简单的代表日志的字符串* 字符串格式:[时间]_触发事件,鼠标坐标,绝对坐标,鼠标按钮,修饰符,修饰符新,点击次数* @param e 鼠标事件的对象,包含很多重要信息* @return 生成的一行代表日志的字符串*/
private static String log(MouseEvent e) throws IllegalAccessException {return ("[" + (new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date(e.getWhen()))) + "]_" //抓取事件发生时间+ "id=" + MouseConst.getConstName(e.getID()) + ", " //发生的事件+ "coordinate=[" + e.getX() + "," + e.getY() + "], " //发生时鼠标坐标+ "absolute[" + e.getXOnScreen() + "," + e.getYOnScreen() + "], " //绝对坐标+ "button=" + e.getButton() + ", " //按下的是哪个鼠标按钮+ "modifiers=" + MouseEvent.getMouseModifiersText(e.getModifiers()) + ", " //修饰符+ "modifiersEx=" + InputEvent.getModifiersExText(e.getModifiersEx()) + ", " //新修饰符+ "clickCount=" + e.getClickCount() //点击次数);
}

现在可以把此方法加入到监听器中试一试了:

public static void main(String[] args) {JButton button = new JButton("Button");button.addMouseListener(new MouseListener() {public void mousePressed(MouseEvent e) { System.out.println(log(e)); }public void mouseReleased(MouseEvent e) { System.out.println(log(e)); }public void mouseClicked(MouseEvent e) { System.out.println(log(e)); }public void mouseEntered(MouseEvent e) { System.out.println(log(e)); }public void mouseExited(MouseEvent e) { System.out.println(log(e)); }});button.addMouseMotionListener(new MouseMotionListener() {public void mouseMoved(MouseEvent e) { System.out.println(log(e)); }public void mouseExited(MouseEvent e) { System.out.println(log(e)); }});JFrame frame = new JFrame("示例4.3");frame.setSize(240, 180);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(button);frame.setVisible(true);
}

5. 适配器

5.1 MouseListener、MouseMotionListener监听器的适配器

MouseListener、MouseMotionListener监听器的适配器都是MouseAdapter,它同时也是MouseWheelListener(鼠标滚轮监听器)的适配器(它同时导出自这3个监听器接口)

6. 注脚


  1. 这两个方法都是在JComponent中定义的,因此这两个监听器适用于JComponent及其子类 几乎是所有组件了。 ↩︎ ↩︎

Java:MouseListener、MouseMotionListener监听器与MouseEvent事件相关推荐

  1. Java MouseEvent事件

    Java MouseEvent事件 在任何事件都可以使用鼠标事件,当发生相关的事件是MouseEvent类自动一个事件对象 addMouseListener(MouseListener listene ...

  2. java实用教程——组件及事件处理——MouseEvent事件

    MouseEvent事件 任何组件上都可以发生鼠标事件,如鼠标进入组件.退出组件.在组件上方单击鼠标.拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个 事件对象,事件源注册监视器的方 ...

  3. java游戏服务器开发之八--网络事件监听器

    java游戏服务器开发之八-网络事件监听器 网络事件监听器,将网络变化交由NetworkListener处理 可以看到,我们现在所有的逻辑都是写在TcpMessageStringHandler里面, ...

  4. JAVA之简陋打地鼠(监听事件的练习)

    只是用来练练监听事件,请忽视程序中可爱的图片..... import java.awt.BorderLayout; import java.awt.FlowLayout; import java.aw ...

  5. java mouselistener,Java MouseListener接口

    本文概述 每当你更改鼠标状态时, 都会通知Java MouseListener.根据MouseEvent进行通知.可在java.awt.event包中找到MouseListener接口.它有五种方法. ...

  6. java swing列表数据加监听,【Java Swing公开课|Java监听列表项选择事件怎么用,看完这篇文章你一定就会了】- 环球网校...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  7. java swing 注册事件_比较Java Swing中三种注册事件的方法

    Swing 是目前Java中不可缺少的窗口工具组,是建立图形化用户界面(GUI)程序的强大工具.Java Swing组件自动产生各种事件来响应用户行为.Java将事件封装成事件类,并且为每个事件类定义 ...

  8. java中的监听器模式

    java中的监听器模式 监听器模式的角色 过程 EventObject EventListener 例子1 监听按钮的点击事件 事件源 event source: Button 事件对象 event ...

  9. Java语言学习--Swing中Button事件监听

    1 前言 今天在使用Java Swing中的JButton的事件触发机制时遇到了许多问题,简单的了解了一下. 2 事件监听机制 事件监听的机制如下图所示分析. 3 代码分析 3.1 分步解析 1.事件 ...

最新文章

  1. 兔子繁殖MATLAB,2011-2012数学建模题
  2. 王者荣耀连接不上服务器最新赛季排名,王者荣耀新赛季连掉三段 初期不能打排位是有原因的...
  3. yolo算法_吴恩达深度学习笔记(100)-目标检测之YOLO 算法讲解
  4. 当用DJANGO的migrate不成功时。。。。
  5. 【转】c# 协变与抗变
  6. html文档基本结构由哪三对,第3章 网页制作及HTML语言基本结构简介.ppt
  7. kotlin 查找id_Kotlin程序查找等边三角形的区域
  8. tf.div()除法运算
  9. ssh框架配置文件流程_通过配置文件和安排增强您的工作流程
  10. linux的ky3关闭防火墙,ky3-8
  11. 利用 Google API 调用谷歌地图 演示1
  12. Luogu4936 Agent1
  13. 【优化求解】基于多阶段动态扰动和动态惯性权重的布谷鸟算法实现目标求解附matlab源码
  14. PTA 7-1 输入名字,输出问候语
  15. Linux系统管理----centos7系统进程管理
  16. 嵌入式系统开发笔记88:认识51微控制器系统架构
  17. 云计算效果如何,Mixpanel现身说法
  18. 微PE安装系统 不显示U盘中镜像文件 的解决方法
  19. android游戏后台运行点击桌面游戏图标游戏重启的解决方法
  20. unity3D 音频播放

热门文章

  1. 力扣(506.539)补8.22
  2. 克服焦虑最好的办法就是让一切变得有序
  3. oracle orclpdb是什么,oracle cdb、pdb参考
  4. MongoDB使用账号密码连接
  5. Intel(Altera)FPGA的SOF转JIC文件和下载详细教程
  6. opencv几个自动检测图片方向的方法
  7. 新款 iMac2021上手体验,这次你心动了吗
  8. zabbix如何监控ip地址_获取zabbix上所有主机的IP和主机名的实例代码
  9. 分享几套免费漫画字体和卡通字体
  10. Visual Studio 2022调节字体大小