2015-04-04 26 views
1

細節:這是一個閃存卡遊戲,每張卡都有問題和答案。 QuizCard是一類具有getQuestion(),getAnswer(),setQuestion(),setAnswer()和兩個字符串實例作爲問答的函數的類。參數化的構造函數需要兩個字符串,第一個作爲問題,第二個作爲答案。

我將問題和答案保存在文本文件中,問題和答案由「/」分隔。所有新問題都從新的一行開始。
例如 - >什麼是印度首都/新德里
泰姬陵在哪裏?/阿格拉

其餘的代碼可以很容易地理解。
爪哇:在Flash卡遊戲中點擊JButton時拋出的NullPointerException異常

問題:單擊「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

你正在創建nextButtonQuizCardPlayer類的實例變量,但裏面go()方法,您初始化局部變量nextButton並添加Listener此局部副本,並加入nextButton這個本地副本的mainPanel(這是上可見風景 )。

雖然實例變量仍然null,因爲你從來沒有分配它anythingy,您試圖訪問內部NextButtonListener類此null變量,如下所示:

nextButton.setText("Show Answer"); 

編輯1:

只需更換go()方法中的這條線:

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

nextButton = new JButton("Show Question"); 

這將工作:-)

+0

感謝調試,但我應該怎麼做才能解決這個問題? – 2015-04-04 13:50:18

+0

@PalkeshJain:請參閱編輯,OP。我希望這會排序thingies :-) – 2015-04-04 14:03:13

+0

謝謝,問題解決了。 :) – 2015-04-04 15:18:14

相關問題