-1

我一直试图找出问题所在,但我无法弄清楚。我使用 w.setCandyAmountLabelText(numberofcandies); 从一个类中调用一个方法。但是它不起作用。我正在尝试更改另一个类中的 jlabel 的文本。这是错误和代码。错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at CandyWindow.setCandyAmountLabelText(CandyWindow.java:111)
at Counter$1.actionPerformed(Counter.java:32)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

主类

public class CandyMain {

public static void main(String[] args) {
    CandyWindow window = new CandyWindow("Candy Box");
    window.init();

}

CandyWindow 类

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class CandyWindow extends JFrame {

public JPanel mainpanel;
public JLabel candyamountlabel;
public JButton eatcandies;
public JLabel candieseaten;
public boolean candiesmorethan10 = false;
public JButton throwcandies;


Counter counter;

CandyWindow(String title) {

    super(title);

    this.setVisible(true);
    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}

CandyWindow() {

}

public void init() {

    counter = new Counter();

    // initialized label

    candyamountlabel = new JLabel("You Have 0 Candies!");
    eatcandies = new JButton("Eat All The Candies!");
    candieseaten = new JLabel("You Have Eaten 0 Candies!");
    throwcandies = new JButton("Throw Candies On Ground!");


    //sets visibilty to false
    candieseaten.setVisible(false);
    throwcandies.setVisible(false);




    // add action listener
    eatcandies.addActionListener(eatcandieslistener);

    // makes panel
    mainpanel = new JPanel();




    // adds label to panel
    mainpanel.add(candyamountlabel);
    mainpanel.add(eatcandies);
    mainpanel.add(candieseaten);
    mainpanel.add(throwcandies);

    // adds panel to jframe
    this.add(mainpanel);
    this.setSize(1600, 850);


    counter.startTimer();


}

ActionListener eatcandieslistener = new ActionListener(){

    @Override
    public void actionPerformed(ActionEvent e) {

        counter.setCandiesEaten(counter.getNumberOfCandies() + counter.getCandiesEaten());
        counter.eatcandies();
        candyamountlabel.setText("You Have 0 Candies!");
        candieseaten.setText("You Have Eaten " + counter.getCandiesEaten() + " Candies!");
        candieseaten.setVisible(true);

    }



};


public void setThrowCandiesVisible(int y){

    if(y == 1){

        candiesmorethan10 = true;

    }
    if(candiesmorethan10){

        throwcandies.setVisible(true);
        throwcandies.repaint();

    }

}

public void setCandyAmountLabelText(long g){

    candyamountlabel.setText("You Have " + g + " Candies!");
    candyamountlabel.repaint();


}

     }

柜台类

import java.awt.event.*;
import javax.swing.*;

public class Counter {

long numberofcandies = 0;
long candiespersecond = 0;
long candieseaten = 0;

CandyWindow w = new CandyWindow();

void startTimer() {

    Timer t = new Timer(1000, timercount);
    t.setRepeats(true);
    t.start();

}

ActionListener timercount = new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {

        // setscandiespersecond to one
        setCandiesPerSecond(1);

        //increases candies
        numberofcandies = candiespersecond + numberofcandies;

        //changes numberofcandieslabel
        w.setCandyAmountLabelText(numberofcandies); 


        //if candies are more than 10 set throw on ground visible
        int x = 0;
        if(numberofcandies > 9){
            x = 1;
            w.setThrowCandiesVisible(x);

        }


        //System.out.println("Number of Candies" + getNumberOfCandies()); //test print works
        //System.out.println("candies eaten" + getCandiesEaten()); //test print works


    }

};



public long getNumberOfCandies() {

    return numberofcandies;

}

public long getCandiesPerSecond() {

    return candiespersecond;
}

public void setCandiesPerSecond(long g) {

    candiespersecond = g;

}

public void eatcandies(){

    numberofcandies = 0;

}

public long getCandiesEaten(){

    return candieseaten;

}

public void setCandiesEaten(long p){

    candieseaten = p;

}


}
4

1 回答 1

0

您的 CandyWindow 会在其中创建一个新的 Counter 对象init()- 但是这个 Counter 对象在创建时会创建一个新的 CandyWindow: CandyWindow w = new CandyWindow();。所以 Counter 没有引用创建 Counter 的 CandyWindow - 我认为您打算这样做。尝试将 CandyWindow 与 Counter 一起传递,例如:

counter = new Counter(this);

并为使用 CandyWindow 的 Counter 创建一个构造函数,并将 w 设置为此引用:

public Counter(CandyWindow w) {
   this.w = w;
}

在这种情况下会导致 NullPointerException,因为 Counter 对象具有对新 CandyWindow 的引用,该init()函数从未被调用 - 因此行:'w.setCandyAmountLabelText(numberofcandies);' in 'onActionPerformed()' 将失败,因为这个新 CandyWindow 的 CandyAmountLabelText 从未初始化。

于 2013-06-27T20:55:42.070 回答