【问题标题】:How to set an arraylist item to a JButton如何将 arraylist 项设置为 JButton
【发布时间】:2018-03-08 17:03:32
【问题描述】:

我正在制作一个游戏,其中提出问题,玩家通过选择四个按钮之一来回答问题。我有两个类,一个是“QuestionsAndButtons”,另一个是“Main”。我想从“QuestionsAndButtons”类中的字符串数组列表中获取一个元素,并将其显示到“Main”类中的 JButton 上。

单击“generalknowledge”按钮时,我想将arraylist 项设置为JButton 'option1'。

主类:

   generalKnowledge.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Categories1.setVisible(false);
                GeneralKnowledge1.setVisible(true);

                String q = quest.getAQuestion(0);
                question1.setText(q);

                String b1 = quest.getButtons(0);
                option1.setText(b1);
            }
        });

QuestionsAndButtons 类:

private ArrayList<String> buttonsGK1;

public  QuestionsAndButtons(){

    questionsGeneralKnowledge=new ArrayList<>();
    buttonsGK1=new ArrayList<>();

    buttonsGK1.add("Eeyore");
    buttonsGK1.add("Tigger");
    buttonsGK1.add("Piglet");
    buttonsGK1.add("Rabbit");

}

public String getButtons(int j) {
    return buttonsGK1.get(j);
}

此外,每次我运行我的代码时,只要单击“通用知识”按钮,就会出现此错误:

线程“AWT-EventQueue-0”java.lang.IndexOutOfBoundsException 中的异常:索引 0 超出长度 0

【问题讨论】:

  • 您要做的是有 4 个选项,每个选项都显示在自己的 JButton 中,对吗?
  • 是的,这正是我想要做的
  • 变量名不应以大写字符开头。您的一些变量是正确的,而另一些则不是。保持一致!!!
  • 对于您遇到的异常,我们需要查看minimal reproducible example 以了解究竟发生了什么
  • 如果您看到java.lang.IndexOutOfBoundsException 的索引为 0,那么当您尝试访问该元素时,该数组或列表为空。使用调试器并检查您访问的数组/列表是否已初始化。

标签: java swing arraylist jbutton


【解决方案1】:

您只需使用数组中的每个选项创建一个JButton:

  1. 创建一个与您的选项长度相同的JButtons 数组
  2. 遍历您的选项并使用选项文本创建一个新的JButton
  3. 将每个 JButton 添加到您正在使用的 JPanel / JFrame

例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ArrayToButtons {
    private JFrame frame;
    private JPanel pane;
    private JButton[] buttons;
    private static final String[] OPTIONS = {"Eagle", "Rabbit", "Dolphin", "Apple"};

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ArrayToButtons()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());
        pane = new JPanel();
        pane.setLayout(new GridLayout(2, 2));

        buttons = new JButton[OPTIONS.length];

        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton(OPTIONS[i]);
            pane.add(buttons[i]);
        }

        frame.add(new JLabel("Which is not an animal?"), BorderLayout.NORTH);
        frame.add(pane, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

【讨论】:

    【解决方案2】:

    感谢您@Frakcool 的回答,但我已经有了一个界面,因为我正在使用 GUI 表单,所以我想要的只是一种简单的方法,可以将我的数组列表中的一个答案设置为我的 JButton 'option1'。

    有没有办法解决这个问题?

    Here is what the UI looks like:

    【讨论】:

    • 1) 这可能是对我的答案的评论,或者对您的问题进行编辑,因为这不是答案。 2) “我想要的只是一种简单的方法,可以将我的数组列表中的一个答案设置为我的 JButton 'option1'” 我已经向您展示了如何使用数组来执行此操作,将数组更改为数组列表,你就完成了...... 3)如果你想让我们检查你的 GUI 代码,你必须提供一个minimal reproducible example 然后
    【解决方案3】:

    将您的按钮放入一个数组或列表中,然后遍历按钮数组和标题数组并设置标题:

    JButton buttons[];
    List<String> titles = quest.getButtons();
    
    for (int i = 0; i < titles.size(); i++) {
        buttons[i].setText(titles.get(i));
    }
    

    其中 quest.getButtons() 在您的示例中返回 buttonsGK1 字段。

    您需要在创建 GUI 时初始化 buttons 数组。 Frakcool's answer 展示了所有这些方面,您只需根据自己的情况采用解决方案即可。

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 2016-01-21
      • 2013-02-02
      • 1970-01-01
      • 2012-04-21
      • 2012-09-26
      • 2012-03-10
      • 2016-05-15
      相关资源
      最近更新 更多