上图是笔者应用Java鼠标事件的捕获,结合Java图形库功能做的一个简单的Painter程序,非常简单。“麻雀虽小,五脏俱全”,这个小程序应用了Java对用户操作的事件的捕获,又应用了Java二维图形功能。捕获事件和图形库有什么用处呢?用处非常大,因为结合这两种技术我们可以开发自己的“可见的,可操控的用户自定义对象”。
Java语言当前在软件工程领域的应用,主要是用于开发Management Information System,即开发管理信息系统。Java主要用于业务逻辑的操作,充当幕后英雄,是网络上的“活雷锋”,与用户交互的Graphical User Interface的工作由Html,javascript,Flash等完成。Java似乎永远都是后台剧务,抢风头、露脸面的机会轮不到Java。
其实不然,例如,我们要开发一个Work Flow平台,开发一个协同工作系统,需要给用户一个图形化的界面来定义工作流,需要定义工作流的节点,节点之间的流转关系,流转事件的触发条件等等,就需要给用户一个可以操控的图形化界面。如下图:
Java语言的AWT包提供了事件的监听器功能,而且提供了Graphics2D图形包。想深入研究的朋友可以深入看一下AWT、Swing和Graphics2D方面的内容。我的Painter程序源码如下:
//
// Description: Java Program to demonstrate capturing mouse event
// author: WangQingda
// date: 2009.05.19
//
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import java.awt.Graphics2D;
public class DrageFrame extends javax.swing.JFrame
{
private int oldX=0;
private int oldY=0;
public DrageFrame() {
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args)
{
//创建窗口对象
DrageFrame drageframe = new DrageFrame();
}
private void jbInit() throws Exception
{
this.addMouseListener(new DrageFrame_this_mouseAdapter(this));
this.getContentPane().setLayout(flowLayout1);
this.setSize(600,400);
this.setVisible(true);
this.setTitle("鼠标事件与图形演示:作者WangQingda");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void this_mousePressed(MouseEvent e)
{
//鼠标按下
this.oldX=e.getX();
this.oldY=e.getY();
System.out.println("pressed : "+e.getX()+" -- "+e.getY());
}
public void this_mouseReleased(MouseEvent e) {
//鼠标释放
int newX=e.getX();
int newY=e.getY();
System.out.println("released : "+e.getX()+" -- "+e.getY());
Graphics2D pt=(Graphics2D)this.getGraphics();
pt.drawLine(this.oldX,this.oldY,newX,newY);
}
FlowLayout flowLayout1 = new FlowLayout();
}
class DrageFrame_this_mouseAdapter extends MouseAdapter {
private DrageFrame adaptee;
DrageFrame_this_mouseAdapter(DrageFrame adaptee) {
this.adaptee = adaptee;
}
public void mousePressed(MouseEvent e) {
adaptee.this_mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
adaptee.this_mouseReleased(e);
}
}
一个实际应用中的用户自定义的可操控的图形对象程序的开发可能要比这复杂得多,要考虑图形对象的数据存储、数据结构、算法。图形的刷新,用户自定义对象的遮挡问题等等。