进修java事宜之前,对java内部类、java经常使用组件、容器、规划管理器、java笼统窗口工具包这些东西有肯定的相识,连系下面的学问点,可以做一些简朴的窗口顺序。(引荐:java视频教程)
Java言语对事宜的处置惩罚采纳的是受权事宜模子。在这个模子下,每一个组件都有响应的事宜,如按钮有单击事宜,文本域具有内容转变事宜等。
当某个事宜被触发后,组件就会将事宜发送给组件注册的每一个事宜监听器,事宜监听器中定义了与差别事宜相对应的事宜的处置惩罚,此时事宜监听器会依据差别的事宜信息挪用差别的事宜处置惩罚者,完成对此次事宜的处置惩罚,只要事宜监听器被触发后才会收到事宜信息。
此种模子的明显特点是,当组件被触发后,自身不去处置惩罚,而将处置惩罚的 操纵交给第三方完成。比方,在GUI单击了一个按钮,此时该按钮就是一个事宜源对象,按钮自身没有权益对此次单击做出回响反映,它做的就是将信息发送给自身注册的监听器(事宜的处置惩罚者,实质上也是个类)来处置惩罚。
明白java的事宜处置惩罚要要明白下面三个主要的提要。
(1)、事宜Event——用户操纵而发作的事宜
(2)、事宜源Event source——发作事宜的组件
(3)、事宜处置惩罚要领Event handle——处置惩罚事宜的要领
1、事宜处置惩罚基本原理
挡在一个按钮上触发一个事宜时,虚拟机发作一个点击事宜对象,然后在按钮即事宜源上查找注册的相干处置惩罚要领,并将事宜对象传给此要领,此要领取得实行。
示例顺序:
鄙人面的顺序中JButton jb就是事宜源,ClickAction就是事宜处置惩罚顺序,jb.addActionListener(a);将事宜源和事宜处置惩罚顺序关联起来,当事宜源上发作点击事宜的时刻,实行ClickAction内里定义的代码。
源代码以下:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class EventTest { public static void main(String[] args) { JFrame j = new JFrame("示例顺序1"); //1、事宜源jb按钮就是事宜源,由于要点击它 JButton jb = new JButton("click"); //2、事宜处置惩罚顺序ClickAction示意事宜处置惩罚顺序 ClickAction a = new ClickAction(); //3、关联,将事宜源和事宜处置惩罚顺序a关联起来,意义是发作点击实行a jb.addActionListener(a); //将jb源事宜添加到窗口中。 j.getContentPane().add(jb); j.pack(); j.setVisible(true); } } //事宜处置惩罚顺序,点击就是一个Action事宜 class ClickAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("hello"); } }
2、事宜对象
在上面你的例子中,ActionEvent就是一个事宜对象,在JButton被按下的时刻,由JButton生成此事宜。事宜被传递给经由过程注册监听器的体式格局注册的ActionListener对象,经由过程它可以获得事宜发作的时候,事宜发作时的事宜源等最罕见的信息。
ActionEvent罕见要领以下:
(1)String getActionCommand():返回与此类行动相干的敕令字符串,默许组件为title。
(2)int getModifiers():返回发作此行动时同时按下的键盘按钮
(3)long getWhen():返回发作此事宜时的事宜的long情势。
示例顺序:
源代码以下:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class EventTest2 { public static void main(String[] args) { JFrame j = new JFrame("示例顺序2"); JPanel jp = new JPanel(); JLabel j1 = new JLabel("请点击"); JButton jb = new JButton("click"); JButton jb1 = new JButton("click"); ClickAction2 a = new ClickAction2(); jb1.addActionListener(a);//假如jb1上发作了Action事宜就实行a内里的代码 jb.addActionListener(a); jp.add(j1); jp.add(jb); jp.add(jb1); j.add(jp); j.setSize(400, 200); j.setVisible(true); } } class ClickAction2 implements ActionListener{ //事宜发作时,actionPerformed要领会被虚拟机挪用,事宜对象回传给该要领 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub long d = e.getWhen();//事宜发作的事宜 Date date = new Date(d);//转化为响应的时候 System.out.println(date); JButton sou = (JButton)e.getSource();//发作的事宜源 sou.setText("点不着");//将点击发作的按钮的按钮设为点不着 //假如没有设置过ActionCommand,默许获得的是按钮的标题 String com = e.getActionCommand(); System.out.println("command is: " +com); } }
3、事宜范例
图形界面开发中由许多的事宜,这些事宜以EventObject为顶层和类,按事宜的范例构成了一个树形构造。
细致见下图:
EventObject是一切事宜类的父类,它内里包括两个要领:
(1)、Object getSource():最初发作Event的对象
(2)、String toString():返回此EventObject的String示意情势。
经由过程getSource():可以晓得事宜是在谁人对象上发作的。
关于其他事宜类的寄义,鄙人面会给出几个类的源码诠释和简朴练习训练。
MouseEvent类
当在一个组件上按下,开释,点击,挪动或许拖动时,就会触发鼠标事宜。
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; public class MouseListenerTest { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); MouL w = new MouL(); j.addMouseListener(w); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MouL implements MouseListener{ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠标的位置: " + e.getX() + "," + e.getY()); System.out.println("点击发作了"); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub System.out.println("按下"); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub System.out.println("松开"); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠标进入了窗口"); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠标离开了窗口"); } }
WindowEvent类
窗口事宜,窗口翻开,封闭,最大化,最小化时,都邑触发窗口事宜
import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; public class WindowsListenerTest { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); WindowL w = new WindowL(); j.addWindowListener(w); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class WindowL implements WindowListener{ @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口翻开时我实行windowOpened"); } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub System.out.println("windowClosing"); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口封闭时我实行windowClosed"); } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口最小化时我实行windowIconified"); } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口复兴时我实行windowDeiconified"); } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口变成活动状况时我实行mouseClicked"); } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口变成不活动状况时我实行windowDeactivated"); } }
ContainerEvent类
当一个组件被加到容器中时或许从一个容器中删除一个组件时,会触发事宜。
import java.awt.event.ContainerListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class ContainerEvent { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); ContL w = new ContL(); JPanel jp = new JPanel(); jp.addContainerListener(w); JButton del = new JButton("删除"); JButton add = new JButton("add"); jp.add(add); jp.add(del);//触发组件添加了 jp.remove(del);//触发组件删除了 j.getContentPane().add(jp); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class ContL implements ContainerListener{ @Override public void componentAdded(java.awt.event.ContainerEvent e) { // TODO Auto-generated method stub System.out.println("组件添加了"); } @Override public void componentRemoved(java.awt.event.ContainerEvent e) { // TODO Auto-generated method stub System.out.println("组件删除了"); } }
FocusEvent
鼠标点击等操纵会让一个组件获得或许落空核心。当一个组件获得核心的时刻,或许落空核心的时刻,就会触发核心事宜
import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class FocusTest { public static void main(String[] args) { JFrame j = new JFrame("key test"); JPanel jp = new JPanel(); JButton j1 = new JButton("1"); JButton j2 = new JButton("2"); j1.addFocusListener(new FocusL()); j2.addFocusListener(new FocusL()); jp.add(j1); jp.add(j2); j.add(jp); j.setSize(600, 500); j.setVisible(true); } } class FocusL implements FocusListener{ @Override public void focusGained(FocusEvent e) { //获得FocusEvent发作时的对象,转化为按钮 // TODO Auto-generated method stub JButton j = (JButton)e.getSource(); //获得按钮的标题 String title = j.getText(); System.out.println("focusGained:按钮" + title + "取得核心"); } @Override public void focusLost(FocusEvent e) { // TODO Auto-generated method stub JButton j = (JButton)e.getSource(); String title = j.getText(); System.out.println("focusLost:按钮" + title + "落空核心"); } }
4、多重监听器
平常情况下,事宜源可以发作多种差别范例的事宜,因此可以注册(触发)多种差别范例的监听器。
一个事宜源组件上可以注册多个监听器,一个监听器可以被注册到多个差别的事宜源上。
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.JTextField; public class MultiListenerTest { public static void main(String[] args) { JFrame a = new JFrame("事宜处置惩罚"); JTextField jf = new JTextField(); a.add(jf, "South"); MouseM m = new MouseM(); //统一事宜源上注册两个事宜监听顺序 //鼠标的监听顺序如点击等 a.addMouseListener(m); //鼠标挪动的监听顺序 a.addMouseMotionListener(m); a.setSize(200, 200); a.setVisible(true); } } class MouseM implements MouseMotionListener, MouseListener{ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.out.println("clicked" + "x:" + e.getX() + ",y:" + e.getY()); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mousePressed"); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseRelsased"); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseEntered"); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseExited"); } @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub System.out.println("拖动:" + e.getPoint()); } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub System.out.println("挪动:" + e.getPoint()); } }
5、事宜适配器(Event Adapter)
为简化编程,JDK针对大多数事宜监听器接口定义了响应的完成类——事宜适配器类,在适配器中,完成了响应监听器接口中的一切的要领,但不做任何事情。
所以定义的监听器类可以继续事宜适配器类,并只重写所须要的要领。
有以下适配器:
- ComponentAdapter (组件适配器)
- ContainerAdapter (容器适配器)
- FocusAdapter (核心适配器)
- KeyAdapter (键盘适配器)
- MouseAdapter (鼠标适配器)
- MouseMotionAdapter (鼠标活动适配器)
- WindowAdapter (窗口适配器)
鼠标适配器示例顺序:MouseListener中由多个要领,但在这里只完成了mouseClicked()
package 图形界面设计; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; public class AdapterTest { public static void main(String[] args) { JFrame z = new JFrame("事宜适配器测试"); z.setSize(500, 400); MouseLS a = new MouseLS(); //注册z上的鼠标事宜处置惩罚顺序,发作点击等事宜实行a里的代码 z.addMouseListener(a); z.setVisible(true); z.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MouseLS extends MouseAdapter{ public void mouseClicked(MouseEvent e){ // 打印出鼠标点击时的x点和y点的坐标 System.out.println("鼠标点击了:" + e.getX() + "," + e.getY()); } }
更多java学问请关注java基础教程栏目。
以上就是java中事宜图文详解的细致内容,更多请关注ki4网别的相干文章!