package AWT;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class DrawLines extends Frame implements Runnable{
private boolean isRunning=false;
Graphics g= getGraphics();
int orgx,orgy,endx,endy;
public DrawLines(){
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
setSize(300,300);
}
protected void processMouseEvent(MouseEvent e){

orgx=e.getX();
orgy=e.getY();
if(e.getID()==MouseEvent.MOUSE_PRESSED)
{
isRunning=true;
//System.out.println("sop");
paint(g);

new Thread(this).start();
}
if(e.getID()==MouseEvent.MOUSE_RELEASED){
isRunning=false;
endx=e.getX();
endy=e.getY();
paint(g);
}
}

public void paint(Graphics g){
//System.out.println("soa");
g.setColor(Color.red);
g.drawLine(orgx,orgy,endx,endy);
}
public void run() {
while(isRunning){
try{
paint(g);
}catch(Exception e){
e.printStackTrace();
}
}

}

}

public class TestDrawLineThread { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
DrawLines dl=new DrawLines();
dl.setSize(300,300);
dl.setVisible(true);
dl.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
((Window)e.getComponent()).dispose();
System.exit(0);

}
});
Thread t=new Thread(dl);
t.start();

}}
我想用线程控制,画出随鼠标移动立即就能显示的线来,可是,运行,有界面,按下鼠标时,报错
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at AWT.DrawLines.paint(TestDrawLineThread.java:35)
at AWT.DrawLines.processMouseEvent(TestDrawLineThread.java:21)
at java.awt.Component.processEvent(Component.java:5806)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Window.processEvent(Window.java:1798)
at java.awt.Component.dispatchEventImpl(Component.java:4413)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Window.dispatchEventImpl(Window.java:2440)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
烦请各位大侠,帮帮小弟,小弟是个菜鸟!如果思路本来就不对,还望各位大哥大姐不吝赐教!

解决方案 »

  1.   

    1  你不要把线程的启动放在鼠标事件监听当中
    2  enableEvents(AWTEvent.MOUSE_EVENT_MASK); 以及对应的process方法只处理了以下一些事件
       按下鼠标按键 
       释放鼠标按键 
       单击鼠标按键(按下并释放) 
       鼠标光标进入组件几何形状的未遮掩部分 
       鼠标光标离开组件几何形状的未遮掩部分
       如果你要处理鼠标拖动的事件,要加上enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);以及对应的process方法
       第一个类修改如下
    class DrawLines extends Frame implements Runnable {
    private boolean isRunning = false;
    Graphics g1 = getGraphics();
    int orgx, orgy, endx, endy; public DrawLines() {
    enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);
    setSize(300, 300);
    } protected void processMouseMotionEvent(MouseEvent e) {


    if (e.getID() == MouseEvent.MOUSE_DRAGGED) {
    isRunning = true;
    // System.out.println("sop");
    endx = e.getX();
    endy = e.getY();
    repaint();
    }
    }
    protected void processMouseEvent(MouseEvent e) {
        

    if (e.getID() == MouseEvent.MOUSE_PRESSED) {
    isRunning = true;
    // System.out.println("sop");
    orgx = e.getX();
    orgy = e.getY();
                
    }

    if (e.getID() == MouseEvent.MOUSE_RELEASED) {
    isRunning = false;
    endx = e.getX();
    endy = e.getY();
    repaint();
    }
    } public void paint(Graphics g) {
    // System.out.println("soa");
    g.setColor(Color.red);
    g.drawLine(orgx, orgy, endx, endy);
    } public void run() {
    while (isRunning) {
    try {
    paint(g1);
    } catch (Exception e) {
    e.printStackTrace();
    }
    } }}
      

  2.   

    另外Draw这个类根本不需要实现线程接口,因为Swing本身的画图机制就是在一个线程中实现,也就是说你的run方法没有必要,下面的Thread t=new Thread(dl); 
    t.start(); 
    都可以去掉