Java - 循环创建动作侦听器

时间:2014-08-19 23:00:56

标签: java while-loop awt actionlistener

有没有办法设置循环来创建多个非常相似的动作侦听器? 出于纯粹的学术目的,我创建了一个纸牌游戏,每张卡片都是一个按钮,当你点击卡片时,它应该面朝上。游戏运行正常,但每个动作监听器都是单独设置的。以下是我在循环中的尝试。

String string1;
String string2;

// called by the constructor
public void setupActionListener() {
    int loopVar = 0;

    while (loopVar <= 16) {
        string1 = "card"+loopVar;
        string2 = "c"+loopVar;

             string1 string2 = new string1();           //A
             // -> card0 c0 = new card0();

             card[loopVar].addActionListener(string2);  //B
             // -> card[0].addActionListener(c0);

    loopVar = loopVar + 1;
}


// the action listener

public class card0 implements ActionListener {          //C
    public void actionPerformed(ActionEvent c0) {       //D
        // perform actions
    }  
}

编辑: 首先,我从未想过“string1 string2 = new string1();”会工作,我只是想要一个大致的想法。

从评论来看,似乎我以一种令人困惑的方式提出这个问题,我的意思是我在构造函数中有这个:

card0 c0 = new card0();
card[0].addActionListener(c0); 
card1 c1 = new card1();
card[1].addActionListener(c1); 
card2 c2 = new card2();
card[2].addActionListener(c2);
card3 c3 = new card3();
card[3].addActionListener(c3);
card4 c4 = new card4();
...     
card15 c15 = new card15();
card[15].addActionListener(c15);

后来这个:

public class card0 implements ActionListener {
    public void actionPerformed(ActionEvent c0) {
        move(0);
    }  
}

public class card1 implements ActionListener {
    public void actionPerformed(ActionEvent c1) {
        move(1);
    }  
}

public class card15 implements ActionListener {
    public void actionPerformed(ActionEvent c2) {
        move(2);
    }  
}
...
public class card15 implements ActionListener {
    public void actionPerformed(ActionEvent c15) {
        move(15);
    }  
}

我想知道是否可以将所有这些放入循环中。似乎答案是否定的,但我只是在问。

1 个答案:

答案 0 :(得分:3)

您提供的代码不是很丰富,所以我不确定我是否理解正确,但也许这个伪代码可以帮助您。

public class Card extends SomeComponent{
    public void turn() {
        //doStuff
    }
}

public class CardGame {

    private SomeComponent[] cards;
    public void prepareGame() {
        CardListener listener = new CardListener();
        for (int i=0; i<=16; i++) {
            cards[i] = new Card();
            cards[i].addActionListener(listener);
        }
    }
}

public class CardListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        ((Card) e.getSource()).turn();
    }

}

您可以使用添加MouseListener或KeyListener而不是ActionListener,它不会为您提供有关已发生事件的详细信息。