【问题标题】:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException - paint() [duplicate]线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException - paint() [重复]
【发布时间】:2015-07-05 05:06:59
【问题描述】:

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

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);
        }
    };

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

【问题讨论】:

  • 您在 draw 方法中使用字段 pointStartpointStart.x 等,但在单击鼠标之前您不会为它们分配任何值,因此在单击鼠标之前,您'会得到很多 NullPointerExceptions。
  • "Swing 程序应该覆盖paintComponent(),而不是覆盖paint()。"—Painting in AWT and Swing: The Paint Methods

标签: java swing paint mouselistener mousemotionlistener


【解决方案1】:

试试这个(注意这是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);
    }
}

【讨论】:

    【解决方案2】:

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

    也许你最好有一个extends JPanel 的类并且有一个构造函数来获取pointStartpointEnd 作为构造函数的参数来避免这个NullPointerException

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

    在你的面板被添加到父容器之后,如果父容器的paintComponents方法被调用(可能发生的原因很多很多次),你的paintpaintComponents方法被相对调用。

    祝你好运。

    【讨论】:

    • 谢谢!很有帮助!
    • 欢迎您。通常,当某个答案有帮助时,您可以投票或将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2013-12-09
    • 1970-01-01
    • 2011-02-03
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多