import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseEvent2 extends JFrame{
private final JPanel panel=new JPanel();
private final JButton button=new JButton("移动我");
public MouseEvent2(){
super("焦点事件处理1");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(0,0,600,400);
getContentPane().add(panel);
panel.add(button);
button.addMouseListener(new Mouse1());
button.addMouseMotionListener(new Mouse1());
}
class Mouse1 implements MouseListener,MouseMotionListener{
//private Point point1;
private Point point2;
private Point point3;
public void mousePressed(MouseEvent e){
point3=e.getPoint();
}
public void mouseReleased(MouseEvent e){
}
public void mouseClicked(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseDragged(MouseEvent e){
point2=e.getPoint();
button.setLocation(button.getX()+point2.x-point3.x,button.getY()+point2.y-point3.y);
}
public void mouseMoved(MouseEvent e){
}
}
public static void main(String[] args){
new MouseEvent2().setVisible(true);
}
}
拖动鼠标时出现,请问是什么问题,谢谢
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at swing.event.MouseEvent.a.MouseEvent2$Mouse1.mouseDragged(MouseEvent2.java:56)
at java.awt.AWTEventMulticaster.mouseDragged(AWTEventMulticaster.java:303)
at java.awt.Component.processMouseMotionEvent(Component.java:6264)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3283)
at java.awt.Component.processEvent(Component.java:5985)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4237)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
import java.awt.event.*;
public class MouseTest extends Frame
{
public MouseTest()
{
Button b = new Button("JavaWorld JavaQ&A");
b.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
);
add(b,BorderLayout.NORTH);
addMouseListener(new MouseTest.MouseHandler());
addMouseMotionListener(new MouseTest.MouseMotionHandler());
}
// MouseHandler is an inner class that implements the MouseListener.
// Each method simply prints out a message to the command line.
private class MouseHandler implements MouseListener
{
public void mousePressed(MouseEvent e)
{
System.out.println("mouse pressed");
}
public void mouseClicked(MouseEvent e)
{
System.out.println("moused clicked");
}
public void mouseReleased(MouseEvent e)
{
System.out.println("mouse released");
}
public void mouseEntered(MouseEvent e)
{
System.out.println("mouse entered");
}
public void mouseExited(MouseEvent e)
{
System.out.println("mouse exited");
}
}
// MouseMotionHandler is an inner class that implements the MouseMotionListener.
// Each method simply prints out a message to the command line.
private class MouseMotionHandler implements MouseMotionListener
{
public void mouseMoved(MouseEvent e)
{
System.out.println("mouse moved");
}
public void mouseDragged(MouseEvent e)
{
System.out.println("mouse dragged");
}
}
public static void main(String[] args)
{
new MouseTest().show();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseEvent2 extends JFrame{ private final JPanel panel=new JPanel();
private final JButton button=new JButton("移动我"); public MouseEvent2(){
super("焦点事件处理1");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(0,0,600,400);
getContentPane().add(panel);
panel.add(button);
Mouse1 mouse=new Mouse1();
button.addMouseListener(mouse);
button.addMouseMotionListener(mouse);
}
class Mouse1 implements MouseListener,MouseMotionListener{
//private Point point1;
private Point point2;
private Point point3;
public void mousePressed(MouseEvent e){
point3=e.getPoint();
}
public void mouseReleased(MouseEvent e){ }
public void mouseClicked(MouseEvent e){ }
public void mouseExited(MouseEvent e){ } public void mouseEntered(MouseEvent e){ } public void mouseDragged(MouseEvent e){
point2=e.getPoint();
button.setLocation(button.getX()+point2.x-point3.x,button.getY()+point2.y-point3.y);
} public void mouseMoved(MouseEvent e){ }
} public static void main(String[] args){
new MouseEvent2().setVisible(true);
}
}
button.addMouseListener(new Mouse1());
button.addMouseMotionListener(new Mouse1());
你添加了两个监听器,可是你添加的时候都是用new Mouse1(),虽然是同一个类,但是是两个对象,真是太有意思了。也就是说,你监听一般操作的是一个对象,而监听移动拖动操作的是另一个对象。这样好了,你想想吧,程序肯定是有问题的吧。就算没有异常,也会有逻辑错误。然而,为什么会有异常呢?
你的point2,point3都是以这种方式赋值的:
point3=e.getPoint();
可是,刚才已经说了,监听操作是两个对象。一个监听按下操作,一个监听拖动操作。
而你监听拖动操作中有这么一句:
button.setLocation(button.getX()+point2.x-point3.x,button.getY()+point2.y-point3.y);
访问point3了。显然,这里面的point3是监听拖动操作的对象的成员point3。可是这个对象只监听拖动滴,也就是说它的point3根本没有被赋过值,其实是根本没有生成对象。按下操作时,设置的是另一个对象的point3。所以,point3是null,异常发生了
button.getX()+point2.x-point3.x,button.getY()+point2.y-point3.y
直接point2不行吗?