我正在测试另一个用于画线的简单程序。第一个问题是错误。
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);
}
};
如果我可以问,我如何保存已绘制的线条?感谢
答案 0 :(得分:1)
你真正的代码是这样的吗?因为当您的程序到达第57行时,pointStart
和pointEnd
成员的任何初始化都没有。因此NullPointerException
因为paint()
或paintComponent()
或paintComponents()
方法在初始渲染,图标化/去图标化或调整大小时被调用了很多时间,所以mouseClick
发生的原因非常明显......小组因此,在用户创建任何mouseDrag
或extends
事件以初始化这些点之前,应该会发生此调用。
您可能更好地拥有pointStart
JPanel 的课程,并且有一个构造函数可以将pointEnd
和NullPointerException
作为构造函数的参数避免这个pointStart
。
如果您无法在创建此面板时确定,则必须检查pointEnd
和paintComponents
的无效或使用(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);
}
}