【问题标题】:Assigning random letters to several jbuttons将随机字母分配给几个 jbutton
【发布时间】:2015-11-17 20:59:06
【问题描述】:

我需要将 4 个随机字母分配给 16 个随机按钮中的 4 个。我目前拥有的是在所有 16 个按钮上放置相同的随机字母。感谢您的帮助!

import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameG implements Runnable {

    public static JButton jba;
    public static JPanel jp;

    @Override
    public void run() {

        JFrame jf = new JFrame("Keybricks");
        Random rnd = new Random();

        jp = new JPanel();

        jp.setLayout(new GridLayout(4, 1));

        jf.setSize(300, 600);
        jf.setVisible(true);
        jf.setResizable(false);
        jf.add(jp);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        char[] letter = new char[1];
        for (int i = 0; i < letter.length; i++) {
            char c = (char) (rnd.nextInt(26) + (65));
            letter[i] = c;
        }

        String text = new String(letter);
        JButton[] buttons = new JButton[16];
        for (int i = 0; i < buttons.length; i++) {
            JButton jba = new JButton(text);
            jba.addKeyListener(new KeyL());
            jp.add(jba);

        }
    }
}

【问题讨论】:

  • 您能否将代码拆分为 a) 一个生成四个随机字母的方法(例如作为列表返回)和 b) 一个随机选择四个 JButton 并将它们也作为列表返回的方法?如果您这样,您只需要遍历列表并将字母分配给相应的按钮。不好,但方法很简单。
  • 不要将 KeyListener 与 JButton 一起使用,使用 ActionListerner,如果您“真的”需要知道何时为按钮键入给定键,那么您应该使用键绑定。至于您的问题,生成一个随机布尔值(0 或 1)或使用随机,当为真并且如果计数小于 4,则生成一个随机字符并更新计数
  • 还建议在整个过程中使用相同的 Random 对象。虽然仍然是可变的,但四个单独的 Random 对象的初始值可以小于(伪)随机。
  • @MadProgrammer 它会在哪里抛出异常?看起来一切都达到了它的最大界限而不是过去。虽然我承认生成随机字符的方法有点古怪,但应该可行
  • @phflack 好的,我绊倒了char[] letter = new char[1];,并没有意识到他们正在使用letter.length,以为他们正在使用其他限制

标签: java arrays swing random jbutton


【解决方案1】:

您的代码有几个问题:

char[] letter = new char[1];
for (int i = 0; i < letter.length; i++) {
    char c = (char) (rnd.nextInt(26) + (65));
    letter[i] = c;
}

我的假设是您想要生成并存储一个随机字母列表。使用上面的代码,您只分配一个大小为 1 的字符数组。因此,您的问题首先从这里开始,因为您只真正生成和存储一个随机字母(您的 for 循环在迭代一次后终止,因为 letter.length 等于 1)。相反,您可能希望将字符数组初始化为要显示的按钮数(即:16),或者,如果您不知道将拥有多少个按钮,那么您将要存储数据在List&lt;Character&gt;add 中将随机生成的字符放入其中,以便以后可以调用它们。

您的下一个问题是通过以下方式转换为字符串:

String text = new String(letter);

如果您阅读the documentation 上面的letter 代表一个字符数组:

分配一个新的字符串,以便它表示当前包含在字符数组参数中的字符序列。字符数组的内容被复制;后续修改字符数组不会影响新创建的字符串。

换句话说,即使您的代码的第一部分正确地生成了一个随机字符数组,您现在已经创建了一个包含数组中每个字符的串联的单个字符串。

相反,要将字符转换为字符串,您实际上只需执行以下简单操作:

String.valueOf('a');

因此,将它们放在一起,首先需要正确生成和存储随机字符,然后需要将字符正确转换为 String 类型,然后需要调用这些值以便将它们分配给每个按钮。

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2015-05-14
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2016-02-17
    • 2021-06-01
    相关资源
    最近更新 更多