1

如何对多个JButton对象进行编程以执行相同的任务?

我正在编写一个在游戏板上使用 25 个按钮的游戏。每个按钮通过生成一个随机数并根据数字更改图标来执行完全相同的操作。

这是我的代码:

    Random RG1 = new Random();
    level_1_random_block = (RG1.nextInt(6));

    final JButton btnNewButton = new JButton("");
    btnNewButton.addMouseListener(new MouseAdapter() {

        public void mouseClicked(MouseEvent arg0) {
            frame2.setVisible(false);
            if (level_1_random_block == 0){
                btnNewButton.setIcon(new        ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreDiamond.png"));
                score += 100;
                initialize_score();
            }
            if (level_1_random_block == 1){
                btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png"));
                score += 25;
                initialize_score();
            }
            if (level_1_random_block == 2){
                btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png"));
                score += 25;
                initialize_score();
            }
            if (level_1_random_block == 3){
                btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png"));
                score += 5;
                initialize_score();
            }
            if (level_1_random_block == 4){
                btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png"));
                score += 5;
                initialize_score();
            }
            if (level_1_random_block == 5){
                btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\creeper.png"));
                score -= 30;
                initialize_score();
            }
            if (level_1_random_block == 6){
                btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\creeper.png"));
                score -= 30;
                initialize_score();
            }

            btnNewButton.removeMouseListener(this);
            level_1_move_on = true;
            continue_game();

        }
    });
    btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\grass_side.png"));
    btnNewButton.setBounds(0, 0, 87, 87);
    frame1.getContentPane().add(btnNewButton);

一切正常,但我想知道是否有一种更简单的方法来编写所有按钮以执行此操作而无需编写 150 条不同的if语句。

4

5 回答 5

4

好吧ActionListener,通过重写方法来实现它来创建一个子类actionPerformed,然后创建它的一个实例,将相同的实例添加到jButton您用例的每个对象中。

class MyActionListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        // your action to be performed
    }
}

注意: MouseListener是 Swing 中的低级 AWT 事件侦听器,其中ActionListener标签较高且更适合使用。但是,使用java.swing.Action更好,它本身action listener不仅提供action-event处理,而且还提供对动作事件触发组件状态的集中处理,例如tool bar buttonsmenu itemscommon buttonstext fields

查看如何使用操作教程了解更多详细信息。

于 2013-10-18T11:11:06.863 回答
2

一些技巧 :

  • 使用 aswitch而不是多个if
  • 用一个ActionListener代替MouseListener
  • 在侦听器内部,访问单击的按钮ActionEvent#getSource()
  • 只创建一个ActionListener并将其添加到所有按钮

希望它有帮助:)

于 2013-10-18T11:12:28.813 回答
1

不要添加鼠标侦听器。只需在您的类中实现 ActionListener :

public SomeClass implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        //Do your stuff here
    }
}

然后附加ActionListener到您的按钮:

btn.addActionListener(this);

或者正如我提到的分离类:

public EventHandler implements ActionListener {
    int level_1_random_block;

    public EventHandler(int level_1_random_block) {
        this.level_1_random_block = level_1_random_block;    
    }

    public void actionPerformed(ActionEvent e) {
        JButton source = (JButton)e.getSource();
        if (level_1_random_block == 0){
                    source.setIcon(new        ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreDiamond.png"));
                    score += 100;
                    initialize_score();
                }
                if (level_1_random_block == 1){
                    source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png"));
                    score += 25;
                    initialize_score();
                }
                if (level_1_random_block == 2){
                    source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png"));
                    score += 25;
                    initialize_score();
                }
                if (level_1_random_block == 3){
                    source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png"));
                    score += 5;
                    initialize_score();
                }
                if (level_1_random_block == 4){
                    source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png"));
                    score += 5;
                    initialize_score();
                }

    }

}

要在您的按钮上添加此侦听器:

btn.addActionListener(new EventHandler(level_1_random_block));
于 2013-10-18T11:11:26.053 回答
0

创建新类,其中将包含有关您的操作的元数据:

class Action{
    String image;
    int score;
}

为您的所有操作定义实例并将它们放入某种数据结构中,如数组或列表,并用适当的索引标记它们。然后,您可以通过 ID 联系他们。

于 2013-10-18T11:16:30.207 回答
0

如果根据随机数变化的只是图像路径和分值,为什么不将它们放入数组或类似的东西中并通过索引访问它们呢?

实际上,如果您以后需要不同的行为,您可以编写一个封装这些字段(现在为图像和分数)的类,并使用此类实例的数组/向量。这样就很容易扩展了。

于 2013-10-18T11:08:55.773 回答