多个JButton执行相同的任务

时间:2013-10-18 11:03:04

标签: java eclipse jbutton

如何编写多个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语句。

5 个答案:

答案 0 :(得分: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处理,还集中处理动作状态 - 事件触发组件,例如{ {1}},tool bar buttonsmenu itemscommon buttons

查看How to Use Actions教程了解更多详情。

答案 1 :(得分:2)

一些提示:

  • 使用switch代替多个if
  • 使用ActionListener代替MouseListener
  • 在监听器内,使用ActionEvent#getSource()
  • 访问点击的按钮
  • 只创建一个ActionListener并将其添加到所有按钮

希望有所帮助:)

答案 2 :(得分: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));

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

制作包含行动元数据的新课程:

class Action{
    String image;
    int score;
}

定义所有操作的实例,并将它们放在某些数据结构中,如数组或列表,并用适当的索引标记它们。 然后你可以通过身份证到达他们。

相关问题