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

“线程中的异常”;AWT-EventQueue-0“;java.lang.NullPointerException-paint(),java,swing,paint,mouselistener,mousemotionlistener,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 java

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

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.drawine(pointStart.x,pointStart.y,pointEnd.x,pointEnd.y)

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

尝试一下(注意这是
paintComponent()
方法,而不是
paint()
):


您的真实代码与此完全相同吗?因为当程序到达第57行时,
pointStart
pointEnd
成员没有任何初始化。因此发生
NullPointerException
有一个非常明显的原因,因为
paint()
paintComponent()
paintComponents()
方法在初始渲染、图标化/去锥化或调整大小或。。。一个小组的成员。所以这个调用应该在用户创建任何
mouseClick
mouseDrag
事件来初始化这些点之前发生

您最好使用
扩展
JPanel的类,并使用构造函数获取
pointStart
pointEnd
作为构造函数的参数,以避免出现这种
NullPointerException

如果在创建此面板时无法确定,则必须检查
pointStart
pointEnd
的空值,或使用(0,0)对它们进行初始化

将面板添加到父容器后,如果调用父容器的
paintComponents
方法(可能由于许多原因和多次发生),则会相对调用
paint
paintComponents
方法


祝你好运。

你在绘图方法中使用了
pointStart.x
等字段,但是在点击鼠标之前你不会给它们赋值,所以在点击鼠标之前你会得到很多空点异常。“Swing程序应该覆盖
paintComponent()
而不是覆盖
paint()
”——。谢谢!这很有帮助!欢迎光临。通常,当一个答案有帮助时,你可以投票支持它或将其标记为答案。
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);
        }
    };
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);
    }
}