1

简而言之,我想将一堆JButton's 累积到一个数组中,并ActionListener为该数组创建一个类。

我正在尝试创建一个计算器,所有带编号的按钮,例如“6”,都在一个JButton数组中,因为我想让它把设置的数字输入到一个临时的 int 中,创建一个会更容易方法,而不是 10 个。我还有 40 个其他按钮,我想将相同的主体应用到不同的数组中,因此将它们放入ActionListener按钮数据的几个方法中会更快更容易被实现到该方法。这是我的代码:

private JButton num0, num1, num2, num3, num4, num5, num6, num7, num8, num9;
private JButton numArray[] = {num0, num1, num2, num3, num4, num5, num6, num7, num8, num9};

        public GUI(){
          numArray.AddActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent event){

             }
       });
  }
4

3 回答 3

10

你可以考虑Newb Monad的提议。但是,您可以对所有按钮使用相同的侦听器,如下例所示。

public static void main(String[] args) {

    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() instanceof JButton) {
                String text = ((JButton) e.getSource()).getText();
                JOptionPane.showMessageDialog(null, text);
            }
        }
    };

    JPanel panel = new JPanel(new GridLayout(4,3));

    JButton[] array = new JButton[10];
    for (int i = 0; i < array.length; i++) {
        array[i] = new JButton(String.valueOf(i));
        array[i].addActionListener(listener);
        panel.add(array[i]);
    }

    JOptionPane.showMessageDialog(null, panel);

}

对话

事件

于 2013-07-12T21:20:11.527 回答
2

你有正确的想法。但是,数组对象没有addActionListener()方法。您必须JButton为每个单独添加一个动作侦听器。您可以为每个按钮使用相同的侦听器,但是您必须确定在方法中单击了哪个按钮actionPerformed()。IMO,更简洁的解决方案是为每个 JButton 分配一个单独的侦听器,因为这样每个 ActionListener 都可以知道按下了哪个数字,而无需检查事件源。例如,您可以创建一个NumberButtonListener将 anint作为其构造函数的唯一参数的类。NumberButtonListener然后,您可以在一个小循环中同时创建 JButtons 和相应的 s。

于 2013-07-12T21:11:02.220 回答
0

我在“连接四”游戏的二维按钮阵列中遇到了类似的问题。我能够在 ActionListener 中使用 for 循环来测试我的哪些按钮被按下了。关键是修改我的按钮类中的 toString() 方法以将数组元素作为字符串提供:

在 JPanel 类定义中: ...

discs = new RoundButton[6][7]; //my 2D array

...

public class RoundButton extends JButton {
...
    public String toString() {
        return "discs["+i+"]["+j+"]";
    }
...
}

private class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event) {

    for (int i = 0; i < discs.length; i++){
        for (int j= 0; j < discs[i].length; j++){
            if (event.getSource() == discs[i][j]){
                discs[i][j].setIcon(yellowDisc); //my particular action for that button
            }                                       
        }

抱歉,这很混乱。我以前从来没有在这里发过帖子。

于 2016-02-25T00:44:39.117 回答