Java JLabel setText方法不工作



我一直想弄清楚问题出在哪里,但我弄不清楚。我使用w.setCandyAmountLabelText(糖果数量)从类中调用一个方法;但是它不起作用。我正在尝试更改另一个类中的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;
}

}

您的CandyWindow在init()中创建了一个新的Counter对象,但这个Counter对象在创建时会生成一个新CandyWindow:CandyWindow w = new CandyWindow();。所以Counter没有引用创建Counter的CandyWindow——我想你是想这么做的。试着把CandyWindow和Counter一起传递,比如:

counter = new Counter(this);

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

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

在这种情况下会导致NullPointerException,因为Counter对象引用了一个新的CandyWindow,其中从未调用过init()函数,因此出现了以下行:"w.setCandyAmountLabelText(糖果数量);"onActionPerformed()"中的CandyAmountLabelText将失败,因为此新CandyWindow从未初始化。

最新更新