Java JLabel setText方法不起作用

时间:2013-06-27 20:38:43

标签: static nullpointerexception jlabel settext

我一直试图找出问题所在,但我无法弄明白。我使用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)

mainclass

public class CandyMain {

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

}

CandyWindow Class

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;

}


}

1 个答案:

答案 0 :(得分:0)

你的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(numberofcandies) ;' in' onActionPerformed()'这个新的CandyWindow的CandyAmountLabelText永远不会被初始化。