2013-05-20 3 views
0

Большая проблема здесь.Hangman GUI applet java

  1. errorLabel не в состоянии показать errorCounter, вместо javax.swing.JLabel [0,670 ... появляется
  2. нажав новую игру, клавиатура сбросить, но не wordLabel (который поставил новый слово для игры), как можно удалить старый wordLabel и заменить новым?

вот мой код:

import java.net.*; 
import java.io.*; 
import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 
import java.applet.Applet; 
import java.util.*; 

public class Hangman extends JApplet implements ActionListener 
{ 
private static final long serialVersionUID = 2005L; 
private Container window; 
private JButton  restart; 
private JLabel  errorLabel; 
private WordList  aWordList; 
private int   errorsCounter; 
private JLabel[]  letterLabel; 
private ArrayList<JButton> letterButton; 
private JPanel  keyboard; 
private JPanel  wordPanel; 
private int   noWordsCorrect; 
private boolean  gameOver; 

public void init() 
{ 
    window = new DoubleBufferedPanel(); 
    setContentPane(window); 
    readWordList("words.txt"); 
    createAppearance(); 
    createGUI(); 
    //createAlphabets(); 
    // JOptionPane.showMessageDialog(this, "" + aWordList.size()); 
} 

public void createAppearance(){ 
    window.setLayout(null); 
} 

public void createGUI() 
{ 
    errorsCounter = 6; 
    gameOver = false; 
    window.removeAll(); 
    createAlphabets(); 
    findWord(); 
    restart = new JButton("New Game"); 
    restart.setLocation(50, 50); 
    restart.setSize(100, 50); 
    restart.addActionListener(this); 
    window.add(restart); 

    errorLabel = new JLabel("6 errors to go"); 
    errorLabel.setSize(150, 50); 
    errorLabel.setLocation(670, 70); 
    window.add(errorLabel); 
    //testLabel = new JLabel("word"); 
    //testLabel.setSize(400, 30); 
    //testLabel.setLocation(50, 120); 
    //window.add(testLabel); 

    //createAlphabets(); 
    //findWord(); 
} 

public void readWordList(String fileName){ 
    try { 
     aWordList = new WordList(new URL(getCodeBase(), fileName), 7, 13); 
    } 
    catch (Exception ex) { 
     JOptionPane.showMessageDialog(this, ex.toString()); 
    } 
} 

public void reset(){ 
    for(JButton b : letterButton){ 
     b.setVisible(true); 
    } 

    if(letterLabel != null) 
    { 
     for(JLabel lbl : letterLabel) 
     { 
      wordPanel.remove(lbl); 
     } 
     wordPanel.invalidate();//signal java got to fix n redo layout 
     wordPanel.validate(); 
    } 

} 

public void actionPerformed(ActionEvent e){ 

    if(e.getSource() == restart) 
    { 
     reset(); 
     String t = aWordList.getRandomWord(); 
     wordPanel.setLayout(new GridLayout(1, t.length())); 
     JOptionPane.showMessageDialog(null, t); 
     letterLabel = new JLabel[t.length()]; 

     for(int i = 0; i <= t.length(); i++) 
     { 
      letterLabel[i] = new JLabel(t.substring(i , i + 1)); 
      letterLabel[i].setVisible(false); 
      wordPanel.add(letterLabel[i]); 
     } 

    } 
    else if(e.getSource() instanceof JButton) 
    { 
     JButton letter = (JButton) e.getSource(); 
     for(int i = 0; i <= letterLabel.length; i++) 
     { 
      if((letterLabel[i].getText()).equals(letter.getText())) 
      { 
       letterLabel[i].setVisible(true); 
       letter.setVisible(false); 
       noWordsCorrect++; 
      } 
      else 
      { 

       letter.setVisible(false); 
       errorsCounter--; 
       errorLabel.setText("" + errorsCounter + " error to go"); 
      } 

     } 

    } 
    else if(noWordsCorrect >= letterLabel.length) 
    { 
     JOptionPane.showMessageDialog(null, "Congratz you win!"); 
     //createGUI(); 
     gameOver = true; 
    } 

    else if(errorsCounter == 0) 
    { 
     JOptionPane.showMessageDialog(null, "OMG you lost!"); 
     gameOver = true; 
    } 
    repaint(); 
} 

public void createAlphabets(){ 
    keyboard = new JPanel(new GridLayout(2,13)); 
    keyboard.setSize(750,150); 
    keyboard.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); 
    keyboard.setLocation(200,200); 

    letterButton = new ArrayList<JButton>(); 
    for(char c = 'a'; c <= 'z'; c++) 
    { 
     JButton s = new JButton("" + c); 
     s.addActionListener(this); 
     keyboard.add(s); 
     letterButton.add(s); 
    } 

    window.add(keyboard); 
    //setVisible(true); 
} 

public void findWord(){ 
    wordPanel = new JPanel(new GridLayout(1, 13)); 
    wordPanel.setSize(250,150); 
    wordPanel.setBorder(BorderFactory.createLineBorder (Color.red, 2)); 
    wordPanel.setLocation(200,50); 
    window.add(wordPanel); 
} 
// JOptionPane.showMessageDialog(this, "[" + t + "]"); 
//testLabel.setText(t); 

class DoubleBufferedPanel extends JPanel { 
    private static final long serialVersionUID = 44L; 

    public void paint(Graphics g){ 
     super.paint(g); 
    } 
} 

} 
+1

Ошибка №1 с использованием пустых макетов – MadProgrammer

+1

Хорошо, я сдаюсь. Я не могу сказать, что здесь происходит - никаких комментариев, ничего не называемых «wordLabel», которые были запрошены в тексте перед кодом, код устанавливает диспетчер компоновки после нажатия кнопки - есть только так много времени в день. – arcy

+0

Почему «компьютерно-научный» тег?!? –

ответ

2

Есть целый ряд проблем, но главные из них вы, кажется, имея вертится вокруг вас for петли ...

Этого ...

for (int i = 0; i <= t.length(); i++) { 

и это ...

for (int i = 0; i <= letterLabel.length; i++) { 

Будет и ломаться, и бросать ArrayIndexOutOfBoundsException исключений.

Помните, что все массивы на Java основаны на 0. То есть массив длиной 5 будет иметь элементы на 0-4

Ваш метод reset должен быть автономным и способен восстанавливать массив letterLabel. Этот метод также следует вызывать из метода init, чтобы запустить игру.

Ваш «угадать проверки» алгоритм не так ...

for (int i = 0; i < letterLabel.length; i++) { 
    if ((letterLabel[i].getText()).equals(letter.getText())) { 
     letterLabel[i].setVisible(true); 
     letter.setVisible(false); 
     noWordsCorrect++; 
    } else { 
     letter.setVisible(false); 
     errorsCounter--; 
     System.out.println("errorsCounter = " + errorsCounter); 
     errorLabel.setText("" + errorsCounter + " error to go"); 
    } 
} 

Это, в основном, уменьшить количество догадки для каждого символа в оригинальном тексте. Итак, если исходный текст «testin», и я выбираю a, у меня больше не останется никаких догадок. Угадывание должно быть уменьшено только в том случае, если в исходном тексте не найдено никакого совпадения ...