如何创建一个带有随机数的数组并将其发送给监听器而不再次随机化?

How to create an array with random numbers and send it to listener without randomizing it again?

所以我正在尝试创建一个程序来创建一个包含 100 个随机数的数组(每次用户对它做出反应时都不会更改),并允许用户通过输入它的索引来检查这些数字。但是,每次用户按下“显示元素”按钮时,数组都会保持随机化。

我也试过在主程序上创建数组,但是我遇到了错误,因为侦听器无法访问数组。请赐教,因为我是这个 Java GUI 编程的新手。非常感谢任何帮助。

import java.util.Random;
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.*;

public class P3Q2 extends JFrame {

    private JTextField text1 = new JTextField(10);
    private JTextField text2 = new JTextField(10);
    private int arr[];

    private JButton jbtShow = new JButton("Show Element");

    public P3Q2() {
        JPanel jpTextField = new JPanel();
        jpTextField.setLayout(new GridLayout(3, 2));
        jpTextField.add(new JLabel("Array Index"));
        jpTextField.add(text1);
        jpTextField.add(new JLabel("Array Element"));
        jpTextField.add(text2);
        text2.setEditable(false);

        JPanel jpButtons = new JPanel();
        jpButtons.add(jbtShow);

        add(jpTextField);
        add(jpButtons, BorderLayout.SOUTH);

        jbtShow.addActionListener(new ButtonListener());

        setTitle("Display: Show Bounds Error");
        setSize(400, 150);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private class ButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            try {
                Random rd = new Random(); // creating Random object
                int[] arr = new int[100];
                for (int i = 0; i < arr.length; i++) {
                    arr[i] = rd.nextInt(); // storing random integers in an array
                }

                if (e.getSource() == jbtShow) {
                    int num = Integer.parseInt(text1.getText());
                    int result = arr[num];
                    text2.setText("" + result);
                }
            } catch (ArrayIndexOutOfBoundsException ex) {
                text2.setText("Out of bound!");
            }

        }
    }

    public static void main(String[] args) {
        P3Q2 test = new P3Q2();
    }
}

在构造函数中,您将随机数分配给一个 局部变量 arr,该变量覆盖具有相同名称的 私有属性 arr

尝试将其更改为:

Random rd = new Random(); // creating Random object
arr = new int[100];
for (int i = 0; i < arr.length; i++) {
    arr[i] = rd.nextInt(); // storing random integers in an array
}

尽管您正在隐藏 arr 字段,但每次处理事件时您仍在创建一个新数组,这是您所说的您不想做的事情。

在事件调度线程中进行重要处理不是一个好主意。它可以绑定 GUI。即使您只生成 100 个随机数,我也建议您初始化数组,然后再使用它。

您可以通过在 ButtonListener class 中设置一个初始化块来做到这一点。然后后续事件将简单地使用该数组而不重新创建它。该数组将在 ButtonListener.

实例化时创建
private class ButtonListener implements ActionListener {
    private int arr[] = new int[100];
    {
        Random rd = new Random();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = rd.nextInt(); // storing random integers in an array
            
        }
    }
    
    public void actionPerformed(ActionEvent e) {
        try {
            if (e.getSource() == jbtShow) {
                int num = Integer.parseInt(text1.getText());
                int result = arr[num];
                text2.setText("" + result);
            }
        } catch (ArrayIndexOutOfBoundsException ex) {
            text2.setText("Out of bound!");
        }
    }
}

如果您需要在侦听器外部访问 arr,您可以使用现有的 private int[] arr; 数组声明,并在 ButtonListener class 中简单地使用它。

另一个观察。捕获异常对于 parseInt 来说是个好主意,因为该值可能不是数字。但是如果解析是可以接受的,为什么不检查以确保它在 0 and arr.length-1 之间(含)?