1

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

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

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

4

2 回答 2

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);
    }
}
于 2015-07-05T06:38:13.917 回答
1

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

extends 拥有JPanel的类并具有要获取的构造函数pointStartpointEnd作为构造函数的参数来避免这种情况对您来说可能会更好NullPointerException

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

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

祝你好运。

于 2015-07-05T07:51:10.123 回答