线程“AWT-EventQueue-0”中的异常java.lang.NullPointerException - paint()

时间:2015-07-05 05:06:59

标签: java swing paint mouselistener mousemotionlistener

我正在测试另一个用于画线的简单程序。第一个问题是错误。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at GUI$2.paint(GUI.java:57)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)

这是第57行的代码 g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);

panel = new JPanel(){
        Point pointStart = null;
        Point pointEnd = null;
        int x = 1;
        {   
            addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                    pointStart = e.getPoint();
                }
                public void mouseReleased(MouseEvent e){
                    pointEnd = e.getPoint();
                }
            });
            addMouseMotionListener(new MouseAdapter(){
                public void mouseMoved(MouseEvent e){
                    pointEnd = e.getPoint();
                }
                public void mouseDragged(MouseEvent e){
                    pointEnd = e.getPoint();
                    repaint();
                }
            });
        }
        public void paint(Graphics g){
            super.paint(g);
            g.setColor(a);
            g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
        }
    };

如果我可以问,我如何保存已绘制的线条?感谢

2 个答案:

答案 0 :(得分:1)

你真正的代码是这样的吗?因为当您的程序到达第57行时,pointStartpointEnd成员的任何初始化都没有。因此NullPointerException因为paint()paintComponent()paintComponents()方法在初始渲染,图标化/去图标化或调整大小时被调用了很多时间,所以mouseClick发生的原因非常明显......小组因此,在用户创建任何mouseDragextends事件以初始化这些点之前,应该会发生此调用。

您可能更好地拥有pointStart JPanel 的课程,并且有一个构造函数可以将pointEndNullPointerException作为构造函数的参数避免这个pointStart

如果您无法在创建此面板时确定,则必须检查pointEndpaintComponents的无效或使用(0,0)初始化它们。

将面板添加到父容器后,如果调用父paint方法(可能由于多种原因而多次发生),您的paintComponents或{ {1}}方法相对称为。

祝你好运。

答案 1 :(得分:0)

试试这个(请注意,这是paintComponent()方法,而不是paint()):

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(a);
    if(pointStart!=null && pointEnd!=null){
        g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
    }
}