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)
烦请各位大侠,帮帮小弟,小弟是个菜鸟!如果思路本来就不对,还望各位大哥大姐不吝赐教!
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)
烦请各位大侠,帮帮小弟,小弟是个菜鸟!如果思路本来就不对,还望各位大哥大姐不吝赐教!
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();
}
} }}
t.start();
都可以去掉