2013-08-07 39 views
1

我試圖做些有趣的事情,並且在我按下gui中的「確定」按鈕後,組件會一直消失。Java:組件在事件後消失

我試圖做一個「猜一個字」節目,其中一個將得到一個提示,然後你可以輸入一個猜測,如果它匹配它會給你一個消息,如果不是,還有一個小竅門。問題是,如果你輸入的不是這個詞,它會給你一個消息,說它不是正確的詞,它會給你另一個提示。但另一個提示不會顯示出來。他們消失了。

我有兩個類,「啓動」「QuizLogic」。 問題到達「showTips」方法的某處(我認爲)。

如果有人想嘗試它自己的文件的鏈接可以在這裏找到:Link to file

謝謝。

public class StartUp { 

    private JFrame frame; 

    private JButton showRulesYesButton; 
    private JButton showRulesNoButton; 
    private JButton checkButton; 

    private JPanel mainBackgroundManager; 

    private JTextField guessEntery; 

    private QuizLogic quizLogic; 

    private ArrayList<String> tips; 

    private JLabel firstTipLabel; 
    private JLabel secondTipLabel; 
    private JLabel thirdTipLabel; 

    // CONSTRUCTOR 
    public StartUp() { 
     // Show "Start Up" message 
     JOptionPane.showMessageDialog(null, "Guess a Word!"); 
     showRules(); 
    } 

    // METHODS 
    public void showRules() { 
     // Basic frame methods 
     frame = new JFrame("Rules"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(new Dimension(500, 500)); 
     frame.setLocationRelativeTo(null); 

     // Creates JLabels and adds to JPanel 
     JLabel firstRule = new JLabel("1. You will get one tip at a time of what the word could be."); 
     JLabel secoundRule = new JLabel("2. You will get three tips and unlimited guesses."); 
     JLabel thirdRule = new JLabel("3. Every word is a noun and in its basic form."); 
     JLabel understand = new JLabel("Are you ready?"); 

     // Creates JPanel and adds JLabels to JPanel 
     JPanel temporaryRulesPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 100, 60)); 

     temporaryRulesPanel.add(firstRule); 
     temporaryRulesPanel.add(secoundRule); 
     temporaryRulesPanel.add(thirdRule); 
     temporaryRulesPanel.add(understand); 

     // Initialize buttons 
     showRulesYesButton = new JButton("Yes"); 
     showRulesNoButton = new JButton("No"); 

     showRulesYesButton.addActionListener(new StartUpEventHandler()); 
     showRulesNoButton.addActionListener(new StartUpEventHandler()); 

     // Creates JPanel and adds button to JPanel 
     JPanel temporaryButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 100, 35)); 

     temporaryButtonPanel.add(showRulesYesButton); 
     temporaryButtonPanel.add(showRulesNoButton); 

     // Initialize and adds JPanel to JPanel 
     mainBackgroundManager = new JPanel(new BorderLayout()); 

     mainBackgroundManager.add(temporaryRulesPanel, BorderLayout.CENTER); 
     mainBackgroundManager.add(temporaryButtonPanel, BorderLayout.SOUTH); 

     //Adds JPanel to JFrame 
     frame.add(mainBackgroundManager); 
     frame.setVisible(true); 
    } 

    public void clearBackground() { 
     mainBackgroundManager.removeAll(); 

     quizLogic = new QuizLogic(); 
     showGuessFrame(); 
     showTips(); 
    } 

    public void showGuessFrame() { 
     JPanel guessPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 50, 10)); 

     firstTipLabel = new JLabel("a"); 
     secondTipLabel = new JLabel("b"); 
     thirdTipLabel = new JLabel("c"); 

     tips = new ArrayList<String>(); 

     guessEntery = new JTextField("Enter guess here", 20); 

     checkButton = new JButton("Ok"); 
     checkButton.addActionListener(new StartUpEventHandler()); 

     guessPanel.add(guessEntery); 
     guessPanel.add(checkButton); 

     mainBackgroundManager.add(guessPanel, BorderLayout.SOUTH); 

     frame.add(mainBackgroundManager); 
    } 

    public void showTips() { 
     JPanel temporaryTipsPanel = new JPanel(new GridLayout(3, 1)); 

     temporaryTipsPanel.removeAll(); 

     tips.add(quizLogic.getTip()); 

     System.out.println(tips.size()); 

     if (tips.size() == 1) { 
      firstTipLabel.setText(tips.get(0)); 
     } 
     if (tips.size() == 2) { 
      secondTipLabel.setText(tips.get(1)); 
     } 
     if (tips.size() == 3) { 
      thirdTipLabel.setText(tips.get(2)); 
     } 

     temporaryTipsPanel.add(firstTipLabel); 
     temporaryTipsPanel.add(secondTipLabel); 
     temporaryTipsPanel.add(thirdTipLabel); 

     mainBackgroundManager.add(temporaryTipsPanel, BorderLayout.CENTER); 

     frame.add(mainBackgroundManager); 
     frame.revalidate(); 
     frame.repaint(); 
    } 

    public void getGuess() { 
     String temp = guessEntery.getText(); 

     boolean correctAnswer = quizLogic.checkGuess(guessEntery.getText()); 

     if (correctAnswer == true) { 
      JOptionPane.showMessageDialog(null, "Good Job! The word was " + temp); 
     } 
     else { 
      JOptionPane.showMessageDialog(null, temp + " is not the word we are looking for"); 
      showTips(); 
     } 
    } 

    private class StartUpEventHandler implements ActionListener { 

     public void actionPerformed(ActionEvent event) { 
      if (event.getSource() == showRulesYesButton) { 
       clearBackground(); 
      } 
      else if (event.getSource() == showRulesNoButton) { 
       JOptionPane.showMessageDialog(null, "Read the rules again"); 
      } 
      else if (event.getSource() == checkButton) { 
       getGuess(); 
      } 
     } 
    } 
} 


public class QuizLogic { 

    private ArrayList<String> quizWord; 
    private ArrayList<String> tipsList; 

    private int tipsNumber; 

    private String word; 

    public QuizLogic() { 
     tipsNumber = 0; 

     quizWord = new ArrayList<String>(); 
     quizWord.add("Burger"); 

     try { 
      loadTips(getWord()); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    public String getWord() { 
     Random randomGen = new Random();   
     return quizWord.get(randomGen.nextInt(quizWord.size())); 
    } 

    public void loadTips(String word) throws FileNotFoundException { 
     Scanner lineScanner = new Scanner(new File("C:\\Users\\Oliver Nielsen\\Dropbox\\EclipseWorkspaces\\BuildingJava\\GuessAWord\\src\\domain\\" + word + ".txt")); 

     this.word = word; 
     tipsList = new ArrayList<String>(); 

     while (lineScanner.hasNext()) { 
      tipsList.add(lineScanner.nextLine()); 
     } 
    } 

    public String getTip() { 
     if (tipsNumber >= tipsList.size()) { 
      throw new NoSuchElementException(); 
     } 
     String temp = tipsList.get(tipsNumber); 
     tipsNumber++; 

     System.out.println(temp); 
     return temp; 
    } 

    public boolean checkGuess(String guess) { 
     return guess.equalsIgnoreCase(word); 
    } 
} 
+1

這一行「temporaryTipsPanel.removeAll();」可能是某種形式的問題......我無法完全理解所有的代碼,因爲它只是很多,但這似乎是最有意義的,因爲你將它縮小到showTips方法 – user2277872

+0

然後我又一次不斷重複我的自我...請只粘貼相關的代碼,而不是整個程序。沒有人會通過所有的線路掃描可能的錯誤。 –

+0

User2277872:謝謝你的回答。我會試着去看看那個。 –

回答

1

我想通了!

我不知道爲什麼它不能做,但如果我刪除了這條線:JPanel temporaryTipsPanel = new JPanel(new GridLayout(3, 1));

,並把它放在另一種方法,它的工作。如果有人能夠解釋爲什麼這會很好,但至少我/我們知道問題所在。

謝謝。 :)