java自定义事件
A. java中addMouseListener(this)中的this是指啥怎么好多方法都有this ,this具体指啥,求详解!!
this是指您正在编写的这个类,在软件运行时(运行时)所实例化的对象。
Swing程序可以说是基于“事件”的程序。所谓“事件”是指程序运行时所发生的事情,包括图形界面的用户交互操作、Swing组件内部对某事件的连续反应所产生的其他事件、某种情况下所发生的自定义事件。
运行时的事件是一个事件对象,它有三个要素:1、事件源是谁,也就是说是在哪个Swing组件中产生的这个事件;2、事件内部所包含的数据,我们可以将一些重要数据封装在事件中;3、有那些监听器对象负责处理这个事件。
总体来讲,一个事件只有一个事件源,可以有0或多个负责处理这个事件的监听器。
事件源负责向外抛出事件,抛出事件就是在告知添加到此事件源的所有监听器,这个事件已经被抛出,已被添加到此事件源负责处理该事件的监听器应该开始处理该事件了。
综上所述,只有将监听器添加到事件源上,当事件被事件源抛出后,才可能会有监听器处理此事件。从你的例子来看,这是在向当前类(事件源)添加一个鼠标事件监听器(此监听器还是当前类的实例)。
重复一下,只有将监听器添加到事件源上,当事件被事件源抛出后,才可能会有监听器处理此事件。
你必须清晰认识到:事件源、事件、监听器是围绕事件的三个不同概念。
作为初学者,很少有机会手动写抛出事件的代码。比如鼠标事件作为Java内部定义好的事件,当用户鼠标在界面中执行任何动作(如移位、点击、拖动等等等等),都会由Java已经封装好的、支持鼠标事件的组件作为事件源,向外抛出鼠标事件。组件(事件源)抛出事件后,应该由添加到此事件源的鼠标事件监听器处理此事件。
一般来讲,Java已经封装好了很多内置事件监听器的接口和实现类,要处理某事件,必须创建一个监听器类,使其实现处理此事件监听器的接口或继承处理此事件监听器的实现类。
B. java KeyEventHandler
EventHandler是一个委托声明
public delegate void EventHandler( object sender , EventArgs e )
注意这里的参数,前者是一个对象(其实这里传递的是对象的引用,如果是button1的click事件则sender就是button1),后面是包含事件数据的类的基类。
下面我们研究一下Button类看看其中的事件声明(使用WinCV工具查看),以Click事件为例。
public event EventHandler Click;
这里定义了一个EventHandler类型的事件Click
前面的内容都是C#在类库中已经为我们定义好了的。下面我们来看编程时产生的代码。
private void button1_Click(object sender, System.EventArgs e)
{
...
}
这是我们和button1_click事件所对应的方法。注意方法的参数符合委托中的签名(既参数列表)。那我们怎么把这个方法和事件联系起来呢,请看下面的代码。
this.button1.Click = new System.EventHandler(this.button1_Click);
把this.button1_Click方法绑定到this.button1.Click事件。 字串8
下面我们研究一下C#事件处理的工作流程,首先系统会在为我们创建一个在后台监听事件的对象(如果是button1的事件那么监听事件的就是button1),这个对象用来产生事件,如果有某个用户事件发生则产生对应的应用程序事件,然后执行订阅了事件的所有方法。
二、简单的自定义事件(1)
首先我们需要定义一个类来监听客户端事件,这里我们监听键盘的输入。
定义一个委托。
public delegate void UserRequest(object sender,EventArgs e);
前面的object用来传递事件的发生者,后面的EventArgs用来传递事件的细节,现在暂时没什么用处,一会后面的例子中将使用。
下面定义一个此委托类型类型的事件
public event UserRequest OnUserRequest;
下面我们来做一个死循环
public void Run() { bool finished=false; do { if (Console.ReadLine()=="h") { OnUserRequest(this,new EventArgs()); } }while(!finished); }
此代码不断的要求用户输入字符,如果输入的结果是h,则触发OnUserRequest事件,事件的触发者是本身(this),事件细节无(没有传递任何参数的EventArgs实例)。我们给这个类取名为UserInputMonitor。
下面我们要做的是定义客户端的类 字串5
首先得实例化UserInputMonitor类
UserInputMonitor monitor=new UserInputMonitor();
然后我们定义一个方法。
private void ShowMessage(object sender,EventArgs e)
{
Console.WriteLine("HaHa!!");
}
最后要做的是把这个方法和事件联系起来(订阅事件),我们把它写到库户端类的构造函数里。
Client(UserInputMonitor m)
{
m.OnUserRequest =new UserInputMonitor.UserRequest(this.ShowMessage);
//m.OnUserRequest =new m.UserRequest(this.ShowMessage);
//注意这种写法是错误的,因为委托是静态的
}
下面创建客户端的实例。
new Client(monitor);
对了,别忘了让monitor开始监听事件。
monitor.run();
大功告成,代码如下:
using System;class UserInputMonitor{ public delegate void UserRequest(object sender,EventArgs e); //定义委托 public event UserRequest OnUserRequest; //此委托类型类型的事件 public void Run() { bool finished=false; do { if (Console.ReadLine()=="h") { OnUserRequest(this,new EventArgs()); } }while(!finished); }}
public class Client{ public static void Main() { UserInputMonitor monitor=new UserInputMonitor(); new Client(monitor); monitor.Run(); } private void ShowMessage(object sender,EventArgs e) { Console.WriteLine("HaHa!!"); } Client(UserInputMonitor m) { m.OnUserRequest =new UserInputMonitor.UserRequest(this.ShowMessage); //m.OnUserRequest =new m.UserRequest(this.ShowMessage); //注意这种写法是错误的,因为委托是静态的 }} 字串3
三、进一步研究C#中的预定义事件处理机制
可能大家发现在C#中有些事件和前面的似乎不太一样。例如
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
}
this.textBox1.KeyPress =newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
这里使用了KeyPressEventArgs而不是EventArgs作为参数。这里使用了KeyEventHandler委托,而不是EventHandler委托。
KeyPressEventArgs是EventArgs的派生类,而KeyEventHandler的声明如下
public delegate void KeyEventHandler( object sender , KeyEventArgs e );
是参数为KeyEventArgs的委托。那为什么KeyPress事件要这么做呢,我们可以从两个类的构造函数来找答案。
public EventArgs();
public KeyPressEventArgs(char keyChar);
这里的keyData是什么,是用来传递我们按下了哪个键的,哈。
我在KeyEventArgs中又发现了属性
public char KeyChar { get; }
进一步证明了我的理论。下面我们来做一个类似的例子来帮助理解。
四、简单的自定义事件(2)
拿我们上面做的例子来改。
我们也定义一个EventArgs(类似KeyEventArgs)取名MyEventArgs,定义一个构造函数public MyEventArgs(char keyChar),同样我们也设置相应的属性。代码如下 字串3
using System;class public MyMyEventArgs(char keyChar) { this.keychar=keychar; } public char KeyChar { get { return keyChar; } }}
因为现在要监听多个键了,我们得改写监听器的类中的do...while部分。改写委托,改写客户端传递的参数。好了最终代码如下,好累
using System;class public MyEventArgs(char keyChar) { this.keyChar=keyChar; } public char KeyChar { get { return keyChar; } }}
class UserInputMonitor{ public delegate void UserRequest(object sender,MyEventArgs e); //定义委托 public event UserRequest OnUserRequest; //此委托类型类型的事件 public void Run() { bool finished=false; do { string inputString= Console.ReadLine(); if (inputString!="") OnUserRequest(this,new MyEventArgs(inputString[0])); }while(!finished); }}
public class Client{ public static void Main() { UserInputMonitor monitor=new UserInputMonitor(); new Client(monitor); monitor.Run(); } private void ShowMessage(object sender,MyEventArgs e) { Console.WriteLine("捕捉到:{0}",e.KeyChar); } Client(UserInputMonitor m) { m.OnUserRequest =new UserInputMonitor.UserRequest(this.ShowMessage); //m.OnUserRequest =new m.UserRequest(this.ShowMessage); //注意这种写法是错误的,因为委托是静态的 }}
C. java自定义事件,线程a如何每一秒钟触发一个事件,然后另一个线程b监听之,并作出反应
线程a是作为事件源,那么线程a这个类就必须提供一个可以增加监听器的方法,就像GUI编程中的addActionListener这个样的方法。线程a这个类里面是有一个专门存放监听器的一个容器,例如是list。然后你 增加监听器的方法就是把监听器放进这个容器里面。你用一个监听器去监听一个事件的发生,就可以在线程a这个类中,写一个产生事件的一段代码,然后每当产生一个事件之后,去遍历list,去调用监听器的对于这个事件的处理方法,这样子就可以了。这应该就是java中的事件模式。
D. 关于java自定义异常类的一个代码
1 程序中的异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
Java异常类层次结构图:
{
=1L;
publicMyException(){
super();
}
publicMyException(Stringmsg){
super(msg);
}
}
使用的话就不演示了 如果你已经研究到了自定义异常 那么我相信你也一定会使用了
如果不会使用 建议学会使用后再来看这篇文章
E. Java 添加按钮点击事件
xml文件代码如下:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2" />
四种方法分述如下:
匿名内部类:
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
tst.show();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
tst.show();
}
});
}
}
自定义单击事件监听类:
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
class MyClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new MyClickListener());
btn2.setOnClickListener(new MyClickListener());
}
}
Activity继承View.OnClickListener,由Activity实现OnClick(View view)方法,在OnClick(View view)方法中用switch-case对不同id代表的button进行相应的处理
public class TestButtonActivity extends Activity implements OnClickListener {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
最后一种是我今天看到的一种写法,在XML文件中逗显示指定按钮的onClick属性,这样点击按钮时会利用反射的方式调用对应Activity中的click()方法地
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button2" />
这里在输完android:的时候按下 Alt+/ 会有 onClick 属性的提示, 但输入到 android:onClick=逗 的地方按下 Alt+/ 并没有提示 onClick 选项,让我突然觉得这里好像有点问题。
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
}
// 注意 这里没有 @Override 标签
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
这种写法整个代码中都不用声明button就可以实现button的单击事件。
F. java自定义事件监听触发的实现
java.util.EventObject 继承
java.util.EventListener 实现
写成自己的事件 。。。。。。。。。。。。
G. Java 编写JFrame窗体右上角红色打叉关闭按钮的自定义事件
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class TestFrame {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int value=JOptionPane.showConfirmDialog(null, "确定要关闭吗?");
if (value==JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
}
}
H. java如何将鼠标点击事件设置到特定图片
图片所在容器.addMouseListener(newMouseListener(){//添加鼠标监听
publicvoidmouseReleased(MouseEvente){
}
publicvoidmousePressed(MouseEvente){
}
publicvoidmouseExited(MouseEvente){
}
publicvoidmouseEntered(MouseEvente){
}
publicvoidmouseClicked(MouseEvente){//鼠标点击时执行
点击后要执行的代码
}
});
I. java自定义异常
代码修改了,如下,有疑问可以追问:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.JOptionPane;
publicclassNumExcp{
publicstaticvoidmain(String[]args){
NumExcpne=newNumExcp();
}
Frameframe;
Panelpanel;
TextFieldtf;
Buttonbtn;
NumExcp(){
frame=newFrame();
panel=newPanel();
btn=newButton("Check");
tf=newTextField(":");
ListenerAL=newListener();
btn.setEnabled(true);
frame.setVisible(true);
frame.setSize(400,400);
frame.setLocation(200,200);
panel.setSize(200,200);
panel.setVisible(true);
frame.add(panel);
frame.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
panel.add(tf);
panel.add(btn);
panel.setLayout(newFlowLayout(FlowLayout.CENTER));
btn.addActionListener(AL);
}
{
publicvoidactionPerformed(ActionEvente){
try{
intn=Integer.valueOf(tf.getText());
check(n);
}catch(Num_Exceptione1){
e1.e_message();
}
}
}
publicvoidcheck(intn)throwsNum_Exception{
if(n<10||n>100){
thrownewNum_Exception("请输入between10to100:");
}else{
tf.setText("Congrats!Yourinputiscorrect!");
}
}
classNum_ExceptionextendsException{
privateNum_Exception(Stringmessage){
super(message);
}
publicvoide_message(){
JOptionPane.showMessageDialog(null,"Invalidinput!"+this.getMessage(),"",JOptionPane.ERROR_MESSAGE);
}
}
}
J. java 自定义事件的触发及监听
JAVA事件响应机制
1,先自定义一个事件
public class MyEvent extends java.util.EventObject{
public MyEvent(Object source)
{
super(source);
}
}
2,再自定义一个监听器
public class MyListener implements java.util.EventListener{
//这里是当事件发生后的响应过程
public void EventActivated(MyEvent me)
{
System.out.println("事件已经被触发");
}
}
3,以下这个类为触发事件的事件源
public class MyObject {
private Vector vectorListeners=new Vector();
public synchronized void addMyListener(MyListener ml)
{
vectorListeners.addElement(ml);
}
public synchronized void removeMyListener(MyListener ml)
{
vectorListeners.removeElement(ml);
}
protected void activateMyEvent()
{
Vector tempVector=null;
MyEvent e=new MyEvent(this);
synchronized(this)
{
tempVector=(Vector)vectorListeners.clone();
for(int i=0;i<tempVector.size();i++)
{
MyListener ml=(MyListener)tempVector.elementAt(i);
ml.EventActivated(e);
}
}
}
//定义一个公用方法用于触发事件
public void test()
{
activateMyEvent();
}
}
4,测试类
public class Test {
public static void main(String[] args)
{
MyObject mo=new MyObject();
//注册该事件
mo.addMyListener(new MyListener());
//触发该事件
mo.test();
}
}