[原创]代码范例:自定义组件和自定义事件

原创 2004年09月01日 19:10:00

[原创]代码范例:自定义组件和自定义事件

自定义事件:
/**
 * @(#) ODTButtonEvent.java
 *
 * Copyright 2004 Opensource Develop Team. All rights reserved.
 */

// package
package com.opensource.event;

// import classes
import java.awt.AWTEvent;

/**
 * 自定义按钮事件。
 *
 * @author ODT
 * @version 1.0 06/05/2004
 * @see AWTEvent
 * @since JDK 1.3
 */
public class ODTButtonEvent extends AWTEvent
{
     public static final int ENTERED = 1; // 鼠标进入BUTTON
     public static final int EXITED = 2; // 鼠标退出BUTTON
     public static final int PRESSED = 3; // 鼠标按下
     public static final int RELEASED = 4; // 鼠标释放

     Object item;
     int buttonState;

     public ODTButtonEvent(ODTButtonable source, Object item, int buttonState)
     {
           super(source, -1);
           this.item = item;
           this.buttonState = buttonState;
     }

     public ODTButtonable getODTButtonable()
     {
           return (ODTButtonable) source; // 返回被监听的对象
     }

     public Object getItem()
     {
           return item;
     }

     public int getButtonState()
     {
           return buttonState; // 返回按钮状态
     }

     public String paramString()
     {
           String s = null;
           switch (buttonState)
           {
                 case ENTERED:
                       s = "ENTERED";
                       break;
                 case EXITED:
                       s = "EXITED";
                       break;
                 case PRESSED:
                       s = "PRESSED";
                       break;
                 case RELEASED:
                       s = "RELEASED";
                       break;
                 default:
                       s = "unknown button state";
           }

           return super.paramString() + " [button=" + s + "]";
     }
}


自定义监听接口:
/**
 * @(#) ODTButtonListener.java
 *
 * Copyright 2004 Opensource Develop Team. All rights reserved.
 */

// package
package com.opensource.event;

// import classes
import java.util.EventListener;

/**
 * 监听ODTButtonEvent接口
 *
 * @author ODT
 * @version 1.0 06/05/2004
 * @see EventListener
 * @since JDK 1.3
 */
public interface ODTButtonListener extends EventListener
{
     void buttonStateChanged(ODTButtonEvent event); // 触发事件
}


自定义构件注册监听器接口:
/**
 * @(#) ODTButtonable.java
 *
 * Copyright 2004 Opensource Develop Team. All rights reserved.
 */

// package
package com.opensource.event;

// import classes

/**
 * 构件实现此接口,可以扩展监听者注册感兴趣的扩展事件
 *
 * @author ODT
 * @version 1.0 06/05/2004
 * @since JDK 1.3
 */
public interface ODTButtonable
{
     public void addButtonListener(ODTButtonListener l); // 注册监听器
     public void removeButtonListener(ODTButtonListener l); // 取消监听器
}


以上是对自定义事件机制的描述,下面是自定义组件。

自定义组件:

/**
 * @(#) ODTButton.java
 *
 * Copyright 2004 Opensource Develop Team. All rights reserved.
 */

// package
package com.opensource.odt;

// import classes
import java.util.*;
import java.awt.*;
import java.awt.event.*;

import com.opensource.event.*;

/**
 * 实现ItemExpandable接口的构件
 *
 * @author ODT
 * @version 1.0 06/05/2004
 * @see Component
 * @see ODTButtonable
 * @since JDK 1.3
 */
public class ODTButton extends Component implements ODTButtonable
{
     private int stated;
     private Vector listeners = new Vector();

     public ODTButton()
     {
           addMouseListener(new MouseAdapter()
           {
                 public void mouseEntered(MouseEvent event)
                 {
                       stated = ODTButtonEvent.ENTERED;
                       entered(stated);
                       repaint();
                 }

                 public void mousePressed(MouseEvent event)
                 {
                       stated = ODTButtonEvent.PRESSED;
                       pressed(stated);
                       repaint();
                 }

                 public void mouseExited(MouseEvent event)
                 {
                       stated = ODTButtonEvent.EXITED;
                       exited(stated);
                       repaint();
                 }
           });
     }

     public void entered(int stated)
     {
           ODTButtonEvent e = new ODTButtonEvent(this, this, stated);
           processButtonEvent(e); // 利用processButtonEvent(e)来触发事件
     }

     public void pressed(int stated)
     {
           ODTButtonEvent e = new ODTButtonEvent(this, this, stated);
           processButtonEvent(e);
     }

     public void exited(int stated)
     {
           ODTButtonEvent e = new ODTButtonEvent(this, this, stated);
           processButtonEvent(e);
     }

     public void paint(Graphics g)
     {
           drawBorder(g);
           drawContent(g);
     }

     public Dimension getPreferredSize()
     {
           return new Dimension(50, 20);
     }

     public void addButtonListener(ODTButtonListener l)
     {
           listeners.addElement(l);
     }

     public void removeButtonListener(ODTButtonListener l)
     {
           listeners.removeElement(l);
     }
    
     public synchronized void processButtonEvent(ODTButtonEvent event)
     {
           Enumeration e = listeners.elements();
           while (e.hasMoreElements())
           {
                 ODTButtonListener l = (ODTButtonListener) e.nextElement();
                 l.buttonStateChanged(event); // 触发事件
           }
     }

     // 按钮边框
     public void drawBorder(Graphics g)
     {
           Dimension size = getSize();
           g.setColor(new Color(174, 23, 145));
           g.drawRoundRect(0, 0, size.width-1, size.height-1, 5, 5);
     }
    
     // 改变按钮颜色
     public void drawContent(Graphics g)
     {
           Dimension size = getSize();
           if (stated == ODTButtonEvent.ENTERED)
           {
                 g.setColor(new Color(248, 199, 238));
           }
           else
                 g.setColor(new Color(236, 111, 210));


           g.fillRoundRect(1, 1, size.width-2, size.height-2, 5, 5);
     }
}
 


测试自定义组件和事件:

/**
 * @(#) ODTButtonTest.java
 *
 * Copyright 2004 Opensource Develop Team. All rights reserved.
 */

// package
package com.opensource.odt;

// import classes
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

import com.opensource.event.*;


/**
 * 测试自定义组件和事件代码范例
 *
 * @author ODT
 * @version 1.0 06/05/2004
 * @see JFrame
 * @see ODTButtonListener
 * @since JDK 1.3
 */
public class ODTButtonTest extends JFrame implements ODTButtonListener
{
     public ODTButtonTest()
     {
           ODTButton button = new ODTButton();
           button.addButtonListener(this); // 注册监听器
           getContentPane().setLayout(new FlowLayout());
           getContentPane().add(button);
           getContentPane().setBackground(Color.WHITE);
           setSize(400, 500);
           setVisible(true);
     }
    
     // 所触发的事件
     public void buttonStateChanged(ODTButtonEvent event)
     {
           ODTButtonable ie = event.getODTButtonable();
           System.out.println(event.paramString());
     }

     public static void main(String[] args)
     {
           new ODTButtonTest();
     }
}

vue使用自定义事件的表单输入组件(日期组件与货币组件)

自定义事件可以用来创建自定义的表单输入组件,使用 v-model 来进行数据双向绑定。 v-model的实现原理 : 这不过是以下示例的语法糖: 在开发项目中,当遇...
  • hanxue_tyc
  • hanxue_tyc
  • 2017年11月03日 16:51
  • 163

Vue.js 组件中的v-on绑定自定义事件理解

每个 Vue 实例都实现了事件接口(Events interface),即:使用 $on(eventName) 监听事件使用 $emit(eventName) 触发事件Vue的事件系统分离自浏览器的E...
  • hayre
  • hayre
  • 2017年03月06日 11:00
  • 13759

快速掌握小程序组件事件自定义参数的方法

我发现看别人的demo真的对学习很有帮助。比如说我看到这个: 一开始很懵逼,完全不知道这个e.currentTarget.dataset.id是什么东西,怎么来的。于是我便去深入研究这部分代码。...
  • BeiLinYu
  • BeiLinYu
  • 2016年12月30日 17:56
  • 9435

利用Vue v-model实现一个自定义的表单组件

上一篇文章  vue v-model实现原理和组件设计 ,我们讲到了,v-model的基本实现原理,这次我们来利用 v-model来实现一个简单的 表单组件 功能描述: 通过点击按钮,可以增减购物数量...
  • yangbingbinga
  • yangbingbinga
  • 2017年03月13日 12:03
  • 6034

Android为自定义控件添加事件

1)文章简介 创建自定义控件并为它添加一个自定义事件 当用户单击自定义控件中的“测试”按钮时触发按钮自定义事件 2)定义一个layout(activity_custom.xml)作为...
  • bfboys
  • bfboys
  • 2016年10月16日 22:31
  • 924

JavaScript实现自定义对象的自定义事件

前言: 大家都知道,在使用JavaScript可以很方便的使用addEventListener函数给DOM对象快速绑定一个或多个事件侦听器。 我们又如何在JavaScript的自定义对象中使用此方...
  • sunwanxin4
  • sunwanxin4
  • 2015年04月19日 11:05
  • 1395

Flex组件组件添加自定义事件

自定义组件如下:com.cp2
  • chenscmail
  • chenscmail
  • 2013年01月08日 13:45
  • 1833

通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程

以下说明可解释自定义的事件的自定义触发过程: 直接上代码,内含说明(界面是两个文本框textbox1,textbox2,和一个button1,界面的Load事件,button的click事件) ...
  • GoodShot
  • GoodShot
  • 2015年03月05日 10:46
  • 6959

在vue2.0中父组件如何触发子组件的自定义方法?

如果我在父组件的button上绑定了click事件,我想当点击button时可以触发子组件(单文件的子组件xx.vue)的某个方法(如fn1),要这样的效果该怎样实现?之前看了vue1的文档实例里面有...
  • sinat_17775997
  • sinat_17775997
  • 2017年03月10日 10:06
  • 1636

Extjs的一个自定义组件

在使用以前的代码的时候发现最新的Extjs版本会出问题,然后自己重写了一下图片浏览的组件,这里我是直接继承 Ext.Component 的,之前的是继承 Ext.view.View (没仔细去查,估计...
  • yangliu19920502
  • yangliu19920502
  • 2016年06月30日 11:16
  • 327
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]代码范例:自定义组件和自定义事件
举报原因:
原因补充:

(最多只允许输入30个字)