线程异常 "AWT-EventQueue-0" java.lang.NullPointerException - paint()
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException - paint()
我正在测试另一个简单的画线程序。第一个问题是错误。
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GUI.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);
}
};
请问,画好的线怎么保存?谢谢
试试这个(注意这是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);
}
}
你的真实代码是这样的吗?因为当您的程序到达第 57 行时,pointStart
和 pointEnd
成员没有任何初始化。因此,NullPointerException
的发生有一个非常明显的原因,因为 paint()
或 paintComponent()
或 paintComponents()
方法在初始渲染期间被调用了很多次,iconify/deiconify 或调整面板的大小或...。所以这个调用应该发生在用户创建任何 mouseClick
或 mouseDrag
事件以初始化这些点之前。
也许你最好有 class which extends
JPanel 并且有一个构造函数来获取 pointStart
和 pointEnd
作为构造函数的参数来避免这种情况 NullPointerException
。
如果在创建此面板时无法确定,则必须检查 pointStart
和 pointEnd
是否为空,或者将它们都初始化为 (0,0).
将面板添加到父容器后,如果调用父容器的 paintComponents
方法(可能由于多种原因多次发生),您的 paint
或 paintComponents
方法是相对调用的。
祝你好运。
我正在测试另一个简单的画线程序。第一个问题是错误。
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GUI.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);
}
};
请问,画好的线怎么保存?谢谢
试试这个(注意这是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);
}
}
你的真实代码是这样的吗?因为当您的程序到达第 57 行时,pointStart
和 pointEnd
成员没有任何初始化。因此,NullPointerException
的发生有一个非常明显的原因,因为 paint()
或 paintComponent()
或 paintComponents()
方法在初始渲染期间被调用了很多次,iconify/deiconify 或调整面板的大小或...。所以这个调用应该发生在用户创建任何 mouseClick
或 mouseDrag
事件以初始化这些点之前。
也许你最好有 class which extends
JPanel 并且有一个构造函数来获取 pointStart
和 pointEnd
作为构造函数的参数来避免这种情况 NullPointerException
。
如果在创建此面板时无法确定,则必须检查 pointStart
和 pointEnd
是否为空,或者将它们都初始化为 (0,0).
将面板添加到父容器后,如果调用父容器的 paintComponents
方法(可能由于多种原因多次发生),您的 paint
或 paintComponents
方法是相对调用的。
祝你好运。