如何编写多个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
语句。
答案 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 buttons
,menu items
和common 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;
}
定义所有操作的实例,并将它们放在某些数据结构中,如数组或列表,并用适当的索引标记它们。 然后你可以通过身份证到达他们。