我一直试图找出问题所在,但我无法弄明白。我使用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;
}
}
答案 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永远不会被初始化。