Проблемы с ActionListener - PullRequest
       46

Проблемы с ActionListener

0 голосов
/ 13 апреля 2020

Я пытаюсь написать программу, которая просит вас нажать на кнопку, чтобы сгенерировать случайное число, а затем заставляет пользователя попытаться угадать, что это за число.

Сейчас я работаю над получить кнопку, чтобы сгенерировать случайное число и сообщить пользователю, что случайное число было сгенерировано с помощью JTextPane. По какой-то причине эта часть кода, кажется, не выполняется правильно.

Я уже создал экземпляр объекта в основном классе и добавил к кнопке actionlistener. Я понятия не имею, что заставляет это не работать должным образом:

package GUIs;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JToggleButton;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import java.awt.Font;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Principal extends JFrame {
//Elements
private JPanel contentPane;
private JTextField attemptField;
private JTextPane hint;
private JButton btnGenerate;
private JButton btnEnter;

//Events
private GenerateRandomNumber genRanNum;

//Misc variables
int ranNum = 1;
private JTextField textField;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Principal frame = new Principal();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public Principal() {

    //Generates JPanel
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    //Generates text field where the user will write the number
    attemptField = new JTextField();
    attemptField.setBounds(130, 59, 130, 26);
    contentPane.add(attemptField);
    attemptField.setColumns(10);

    //Generates the hint
    hint = new JTextPane();
    hint.setBackground(SystemColor.window);
    hint.setText("First, generate a new number!");
    hint.setBounds(130, 110, 192, 19);
    contentPane.add(hint);

    //Generates the button that should call for the creation of the new number
    btnGenerate = new JButton("Generate number");
    btnGenerate.setFont(new Font("Lucida Grande", Font.PLAIN, 10));
    btnGenerate.setBounds(165, 153, 117, 29);
    contentPane.add(btnGenerate);
    btnGenerate.addActionListener(genRanNum);

    //Generates button that will be used to enter the number
    btnEnter = new JButton("Enter");
    btnEnter.setBounds(269, 59, 58, 29);
    contentPane.add(btnEnter);
}

public class GenerateRandomNumber implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        ranNum = (int) (Math.random() * 101);

        hint.setText("The number has been created!");
    }

}

}

1 Ответ

1 голос
/ 13 апреля 2020
private GenerateRandomNumber genRanNum;

Ваш генератор случайных чисел равен нулю. Я не вижу, где вы когда-либо создавали его экземпляр.

btnGenerate.addActionListener(genRanNum);

Вышеприведенный оператор ничего не делает, потому что переменная равна нулю. (ie. ActionListener не был добавлен к кнопке)

Я даже не знаю, как ваш класс GenerateRandomNumber скомпилируется, потому что у него нет доступа к переменной "hint" вашего "Principal" class.

Не делайте класс GenerateRandomNumber общедоступным c классом. Вместо этого сделайте его внутренним классом класса «Principal».

Прочтите раздел из учебного пособия по Swing по Как использовать Actions для примера, показывающего, как использовать внутренние классы. Обратите внимание, что вы даже можете использовать Action вместо ActionListener.

...