Java:在Flash Card游戏中单击JButton时抛出NullPointerException

时间:2015-04-04 05:11:11

标签: java swing nullpointerexception jbutton

详细信息:这是一张Flash Card游戏,每张卡都有问答 QuizCard是具有getQuestion(),getAnswer(),setQuestion(),setAnswer()和两个String实例作为问题和答案的函数的卡类。参数化构造函数需要两个字符串,第一个作为问题,第二个作为答案。

我在一个文本文件中保存了问题和答案,其中问题和答案用“/”分隔。所有新问题都从新的一行开始 例如。 - >什么是印度的首都?/新德里
        泰姬陵在哪里?/阿格拉

其余代码可以很容易理解。

问题:当单击“nextButton”时,它会抛出NullPointerException并且不会更改“nextButton”上的文本。

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

public class QuizCardPlayer 
{

private JFrame frame;
private JTextArea display;
private boolean isAnswer = true;
private JButton nextButton;
private ArrayList<QuizCard> cardList;
private int currentCardIndex;

public static void main(String[] args)
{
    QuizCardPlayer player = new QuizCardPlayer();
    player.go();
}

public void go()
{
    frame = new JFrame("Quiz Card Player");
    display = new JTextArea(6,20);
    JPanel mainPanel = new JPanel();
    Font bigFont = new Font("serif", Font.BOLD, 24);
    display.setFont(bigFont);
    JScrollPane scroller = new JScrollPane(display);
    scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    display.setText("Lets Start!");
    JButton nextButton = new JButton("Show Question");

    mainPanel.add(scroller);
    mainPanel.add(nextButton);
    nextButton.addActionListener(new NextButtonListener());

    JMenuBar menuBar = new JMenuBar();
    JMenu fileMenu = new JMenu("File");
    JMenuItem loadMenuItem = new JMenuItem("Load card set");
    loadMenuItem.addActionListener(new LoadMenuListener());
    fileMenu.add(loadMenuItem);
    menuBar.add(fileMenu);
    frame.setJMenuBar(menuBar);
    frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
    frame.setVisible(true);
    frame.setSize(300,300);
}

public class NextButtonListener implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        System.out.print("Called!!");
       if(isAnswer)
       {
            nextButton.setText("Show Answer");
            if( currentCardIndex < cardList.size() )
            {
                display.setText(cardList.get(currentCardIndex).getQuestion());
                isAnswer = false;
            }
            else
            {
                display.setText("That was last Card.");
                nextButton.setEnabled(false);
            }
        }
        else
        {
            nextButton.setText("Next Card");
            display.setText(cardList.get(currentCardIndex).getAnswer());
            isAnswer = true;
            currentCardIndex++;
        }
    }
}

public class LoadMenuListener implements ActionListener
{
    public void actionPerformed(ActionEvent ev)
    {
        JFileChooser openFile = new JFileChooser();
        openFile.showOpenDialog(frame);
        loadFile(openFile.getSelectedFile());
    }
}

public void loadFile(File loadFile)
{
    try
    {
        BufferedReader reader = new BufferedReader(new FileReader(loadFile));
        String line="";
        cardList = new ArrayList<QuizCard>();
        while( (line = reader.readLine()) != null )
        {
            String[] result = line.split("/");
            QuizCard card = new QuizCard(result[0] , result[1]);
            cardList.add(card);
            currentCardIndex=0;
        }
        reader.close();
    }
    catch(IOException ex)
    {
        ex.printStackTrace();
    }
}
}

我是Java的新手,只有一个月的经验,任何建议都是最受欢迎的。

1 个答案:

答案 0 :(得分:1)

您正在创建nextButton作为类QuizCardPlayer的实例变量,但在go()方法内,您初始化局部变量nextButton并添加Listener此本地副本,并将nextButton的本地副本添加到mainPanel(在VIEW上可见)。

虽然实例变量仍为null,但您从未将其分配给任何内容,并且您尝试在null类中访问此NextButtonListener变量,如下所示:

nextButton.setText("Show Answer");

编辑1:

只需在go ()方法中替换此行:

JButton nextButton = new JButton("Show Question");

nextButton = new JButton("Show Question");

这将起作用: - )