2013-06-27 4 views
-1

Я пытался выяснить, в чем проблема, но я не могу понять это. Я вызываю метод из класса, используя w.setCandyAmountLabelText (numberofcandies); Однако это не сработает. Я пытаюсь изменить текст jlabel, который находится в другом классе. Вот ошибка и код. ошибкаJava JLabel setText Метод не работает

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 Класс

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

Ваш CandyWindow создает новый счетчик объекта в init() - Но этот объект Counter создает новый CandyWindow при его создании: CandyWindow w = new CandyWindow();. Таким образом, счетчик не ссылается на CandyWindow, который создал Counter, который, я думаю, вы хотели сделать. Попробуйте пропусканием CandyWindow вместе со счетчиком, как:

counter = new Counter(this); 

и создания конструктора для счетчика, который принимает CandyWindow, и устанавливает вес этой ссылке, вместо:

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

NullPointerException вызывается в этом случае, потому что объект Counter имеет ссылку на новый CandyWindow, из которых функция init() никогда не вызывается - следовательно, строка: 'w.setCandyAmountLabelText (numberofcandies); в 'onActionPerformed()' провалится для CandyAmountLabelText этого нового CandyWindow никогда не инициализируется.

+0

Большое вам спасибо, что сделал трюк! – gman9732