0

当我将它作为标签“JLabel lblWord = new JLabel(randomWord) 运行时,它不显示标签,但是当我作为 system.out.println(randomWord) 运行时,它给了我空值......它假设返回其中一个词在文本文件中,但即使我将整个代码移到底部,它似乎也不起作用

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.List;

public final class Hangman extends JFrame
{
    static String randomWord;
    int i = 0;
    static JPanel panel;
    static JPanel panel2;
    static JPanel panel3;
    static JPanel panel4;

    public static String readWord()
    {
        try
        {
            BufferedReader reader = new BufferedReader(new FileReader("Words.txt"));
            String line = reader.readLine();
            List<String> words = new ArrayList<String>();
            while(line != null)
            {
                String[] wordsLine = line.split(" ");
                boolean addAll = words.addAll(Arrays.asList(wordsLine));
                line = reader.readLine();
            }
            Random rand = new Random(System.currentTimeMillis());
            String randomWord = words.get(rand.nextInt(words.size()));
        }catch (Exception e){

        }
        return randomWord;
    }

    public Hangman()
    {

        JButton[] buttons = new JButton[26];

        panel = new JPanel(new GridLayout(0,9));
        panel2 = new JPanel();
        panel3 = new JPanel();
        panel4 = new JPanel();

        JButton btnRestart = new JButton("Restart");
        btnRestart.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {

            }
        });

        JButton btnNewWord = new JButton("Add New Word");
        btnNewWord.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    FileWriter fw = new FileWriter("Words.txt", true);
                    PrintWriter pw = new PrintWriter(fw, true);

                    String word = JOptionPane.showInputDialog("Please enter a word: ");

                    pw.println(word);
                    pw.close();
                }
                catch(IOException ie)
                {
                    System.out.println("Error Thrown" + ie.getMessage());
                }
            }
        });

        JButton btnHelp = new JButton("Help");
        btnHelp.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e)
           {
               String message = "The word to guess is represented by a row of dashes, giving the number of letters and category of the word."
                       + "\nIf the guessing player suggests a letter which occurs in the word, the other player writes it in all its correct positions."
                       + "\nIf the suggested letter does not occur in the word, the other player draws one element of the hangman diagram as a tally mark."
                       + "\n"
                       + "\nThe game is over when:"
                       + "\nThe guessing player completes the word, or guesses the whole word correctly"
                       + "\nThe other player completes the diagram";
               JOptionPane.showMessageDialog(null,message, "Help",JOptionPane.INFORMATION_MESSAGE);
           }
        });

        JButton btnExit = new JButton("Exit");
        btnExit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

        ImageIcon icon = new ImageIcon("D:\\Varsity College\\Prog212Assign1_10-013803\\images\\Hangman1.jpg");
        JLabel lblWord = new JLabel(randomWord);
        JLabel label = new JLabel();
        label.setIcon(icon);
        String  b[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        for(i = 0; i < buttons.length; i++)
        {
            buttons[i] = new JButton(b[i]);

            panel.add(buttons[i]);
        }

        panel2.add(label);

        panel3.add(btnRestart);
        panel3.add(btnNewWord);
        panel3.add(btnHelp);
        panel3.add(btnExit);
        panel4.add(lblWord);
    }

    public static void main(String[] args) 
    {

        System.out.println();
        Hangman frame = new Hangman();
        Box mainPanel = Box.createVerticalBox();
        frame.setContentPane(mainPanel);
        mainPanel.add(panel, BorderLayout.NORTH);
        mainPanel.add(panel2);
        mainPanel.add(panel4);
        mainPanel.add(panel3);
        frame.pack();
        frame.setVisible(true);
    }
}
4

1 回答 1

3

randomWord 变量被声明了两次,一次在 Hangman 类中,它在那里保持为空,第二次在 readWord 方法中,它被一个随机字符串填充,然后返回。请理解,这是两个完全不同的变量。此外,在其中声明的变量readWord()的作用域也仅限于此方法。换句话说,它根本不存在于此方法之外。

解决方案:

  • 摆脱 Hangman 类中的 randomWord 变量——它比没有价值更糟糕,因为它具有误导性。
  • 在需要时调用 readWord() 方法来获取您的随机单词。这就是为什么您首先使用此方法的原因。
  • 阅读变量范围和变量阴影,这是您遇到问题的两个概念。
  • 一旦将所有单词放入ArrayList<String>. 然后,当我需要一个随机词时,我会从 ArrayList 中随机获取一个。无需继续重新阅读同一个文件。
于 2012-08-20T23:46:06.350 回答