【问题标题】:Reset Java field unresolved compilation problem重置Java字段未解决的编译问题
【发布时间】:2020-12-18 17:40:03
【问题描述】:

我正在尝试计算用户在使用 swing 的 Java GUI 程序中猜测数字的次数。

我创建了这些变量来跟踪尝试次数:

    JLabel lblNumberOfTries = new JLabel("Number of tries:");
    lblNumberOfTries.setBounds(136, 219, 90, 13);
    getContentPane().add(lblNumberOfTries);
    
    txtNumberOfTries = new JTextField();
    txtNumberOfTries.setBounds(223, 219, 42, 13);
    getContentPane().add(txtNumberOfTries);
    txtNumberOfTries.setColumns(10);

我需要在游戏重新开始时重置它们。出于某种原因,我可以重置 java 字段,但不能重置标签:

txtNumberOfTries.setText(""); // this is ok
lblNumberOfTries.setText(""); // this gives an error

这是我得到的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    lblNumberOfTries cannot be resolved

    at GuessingGame.newGame(GuessingGame.java:50)
    at GuessingGame.main(GuessingGame.java:110)

这是我的程序中标签和字段所在的类和函数:

import javax.swing.JFrame;      
    
    public class GuessingGame extends JFrame {
        public GuessingGame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Tim's Hi-Lo Guessing Game");
        getContentPane().setLayout(null);

        JLabel lblTitle = new JLabel("Tim's Hi-Lo Guessing Game");
        lblTitle.setFont(new Font("Tahoma", Font.BOLD, 15));
        lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
        lblTitle.setBounds(0, 10, 436, 32);
        getContentPane().add(lblTitle);

        JLabel lblGuessANumber = new JLabel("Guess a number between 1 and 100:");
        lblGuessANumber.setBackground(new Color(240, 240, 240));
        lblGuessANumber.setHorizontalAlignment(SwingConstants.RIGHT);
        lblGuessANumber.setBounds(147, 54, 215, 13);
        getContentPane().add(lblGuessANumber);

        txtGuess = new JTextField();
        txtGuess.addActionListener((ActionEvent e) -> {
            checkGuess();
        });
        txtGuess.setHorizontalAlignment(SwingConstants.RIGHT);
        txtGuess.setBounds(260, 122, 27, 19);
        getContentPane().add(txtGuess);
        txtGuess.setColumns(10);

        JButton btnGuess = new JButton("Guess!");
        btnGuess.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                checkGuess();
            }
        });
        btnGuess.setBounds(172, 121, 85, 21);
        getContentPane().add(btnGuess);

        lblOutput = new JLabel("Enter a number above and click Guess!");
        lblOutput.setHorizontalAlignment(SwingConstants.CENTER);
        lblOutput.setBounds(58, 196, 350, 13);
        getContentPane().add(lblOutput);
        
        JLabel lblNumberOfTries = new JLabel("Number of tries:");
        lblNumberOfTries.setBounds(136, 219, 90, 13);
        getContentPane().add(lblNumberOfTries);
        
        txtNumberOfTries = new JTextField();
        txtNumberOfTries.setBounds(223, 219, 42, 13);
        getContentPane().add(txtNumberOfTries);
        txtNumberOfTries.setColumns(10);
}

public void newGame() {
    theNumber = (int) (Math.random() * 100 + 1);
    txtNumberOfTries.setText("");
    lblNumberOfTries.setText("");
    
}

}

我做错了什么?

【问题讨论】:

  • 我的猜测是 lblNumberOfTries 在方法中被声明为局部变量,而您正试图从不同的方法访问它。您应该使其成为该类的成员,以便可以从该类的不同方法访问它。考虑发布minimal reproducible example,这样我就不必猜测您的问题是什么。
  • 好的,我已经在更新的 OP 中包含了标签和字段在我的程序中的两个函数。如果我需要提供更多信息,请告诉我。
  • 正是这个@Abra

标签: java swing compiler-errors jlabel


【解决方案1】:

好的,所以看到完整的文件后,主要有2点:

你需要在类中定义一个字段private JLabel lblNumberOfTries;

您还需要在 GuessingGame 构造函数的第 98 行左右删除“JLabel”(定义的方法public GuessingGame() 称为构造函数),使其变为lblNumberOfTries = new JLabel("Number of tries:");。这将阻止您重新声明变量。

在某些时候,您还需要添加一个名为 numberOfTries 的私有 int 字段

【讨论】:

  • 谢谢!这解决了它。现在我需要想办法让 numberOfTries 显示在 GUI 中。我在这方面真的很陌生。但是感谢您迄今为止的帮助!
  • 别担心!这部分应该不会太难,所以我相信你会没事的!
  • 再次感谢!我稍后会尝试解决这个问题。好东西!我很高兴它开始起作用了。如果您想继续关注,我在 java 牧场上也有一个线程:coderanch.com/t/737583/java/Java-swing-GUI-program-add#3429683
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多