所以我的代码看起来像这样:
class Pozadina extends JPanel implements MouseListener {
ArrayList<Pozicija> list;
public Pozicija _11;
public void paintComponent(Graphics g){
ArrayList<Pozicija> list=new ArrayList<Pozicija>();
Pozicija _11=new Pozicija();
_11.setCoords(korak,korak);
list.add(_11);
//lots of drawing here
for (Pozicija p:list) {
if (p.getBelongsTo()==1){
g.setColor(Color.blue);
}
g.fillOval(p.getX(), p.getY(), 20, 20;
g.setColor(Color.black);
}//for loop
}//paintComponent method
然后我的主要看起来像这样:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(630,630);
Pozadina pozadina= new Pozadina();
frame.getContentPane().add(pozadina);
frame.addMouseListener(pozadina);
frame.setVisible(true);
}
点击事件如下:
public void mouseClicked(MouseEvent e) {
_11.setPlayer1();
pozadina.repaint();
}
所以问题是我在图形中创建_11对象,因此鼠标Clicked方法返回空指针异常。我有Pozicija _11;设置为类的实例变量,但它不起作用。我试图弄清楚如何避免这种情况,但我对java很新,而且我没有想法。
编辑:即使我这样做,我也会收到Null Point Exception错误。 :S
public void mouseClicked(MouseEvent e) {
/*_11.setPlayer1();
pozadina.repaint();*/
}
它告诉我它的行“/ * _ 11.setPlayer1();”。不知道发生了什么。
我确实尝试了2个发布的建议,我总是将_11作为一个类中的实例变量,我只是没有在这里复制。
EDIT2:首先,感谢所有答案。 :D我已经更新了我的代码,以显示我有list和_11作为实例变量,它总是这样,我只是在我复制代码时没有复制它。请检查上次编辑,它可能会帮助你。我假设我因为别的东西而得到错误,因为即使我对我所考虑的部分发表评论导致错误,我仍然会得到错误。感谢。
答案 0 :(得分:1)
您必须在类环境中定义_11,否则如果不直接作为输入传递,则无法从另一个方法中获取方法中定义的变量。
class Pozadina extends JPanel implements MouseListener {
public Pozicija _11;
public void paintComponent(Graphics g){
ArrayList<Pozicija> list=new ArrayList<Pozicija>();
_11=new Pozicija();
_11.setCoords(korak,korak);
list.add(_11);
//lots of drawing here
for (Pozicija p:list) {
if (p.getBelongsTo()==1){
g.setColor(Color.blue);
}
g.fillOval(p.getX(), p.getY(), 20, 20;
g.setColor(Color.black);
}//for loop
}//paintComponent method
答案 1 :(得分:1)
我没有看到_11
被声明为实例变量的位置,但我确实在_11
方法中看到了paintComponent
的声明
Pozicija _11=new Pozicija();
_11.setCoords(korak,korak);
list.add(_11);
现在,如果这不会使您的代码无法编译,那么唯一的逻辑结论就是它将任何现有的实例变量_11
放在该方法的其余部分的范围之外,并且它不会被更改如果你对它采取任何措施。
为了使它成为一个实例字段,必须在方法之外声明它,如此
class Pozadina extends JPanel implements MouseListener {
public /*or private*/ Pozicija _11;
public void paintComponent(Graphics g){
ArrayList<Pozicija> list=new ArrayList<Pozicija>();
_11=new Pozicija();
_11.setCoords(korak,korak);
...
答案 2 :(得分:0)
在Pozina构造函数中保存_11变量并将其从paint()方法中删除。
您的代码可能看起来像这样:
class Pozadina extends JPanel implements MouseListener {
private Pozicija _11;
ArrayList<Pozicija> list=new ArrayList<Pozicija>();
public Pozadina(){
_11=new Pozicija();
}
public void paintComponent(Graphics g){
_11.setCoords(korak,korak);
list.add(_11);
//lots of drawing here
for (Pozicija p:list) {
if (p.getBelongsTo()==1){
g.setColor(Color.blue);
}
g.fillOval(p.getX(), p.getY(), 20, 20;
g.setColor(Color.black);
}//for loop
}//pa
public void mouseClicked(MouseEvent e) {
_11=new Pozicija();
_11.setPlayer1();
pozadina.repaint();
}
}