如何为任何JButton添加两个不同的事件

时间:2012-04-21 17:44:23

标签: java swing event-handling jbutton

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

    public class Proyecto_Frame extends JFrame {
    private ImageIcon Aston;
    private ImageIcon Ferrari;
    private ImageIcon Lambo;
    private ImageIcon McLaren;
/**
 * 
 */
    private static final long serialVersionUID = 1L;



        public Proyecto_Frame () {
            super ("Carrera");
            this.setLayout(null);

            Aston = new ImageIcon (getClass().getResource("Aston1.png"));
            Ferrari = new ImageIcon (getClass().getResource("Ferrari1.png"));
            Lambo = new ImageIcon (getClass().getResource("Lambo1.png"));
            McLaren = new ImageIcon (getClass().getResource("McLaren1.png"));

            final JLabel Aston1 = new JLabel(Aston);
            final JLabel Ferrari1 = new JLabel(Ferrari);
            final JLabel Lambo1 = new JLabel(Lambo);
            final JLabel McLaren1 = new JLabel(McLaren);

            final JLabel Aston2 = new JLabel(Aston);
            final JLabel Ferrari2 = new JLabel(Ferrari);
            final JLabel Lambo2 = new JLabel(Lambo);
            final JLabel McLaren2 = new JLabel(McLaren);

            JButton B_Aston = new JButton (Aston);
            JButton B_Ferrari = new JButton (Ferrari);
            JButton B_Lambo = new JButton (Lambo);
            JButton B_McLaren = new JButton (McLaren);

            B_Aston.setBounds(new java.awt.Rectangle(30,30,230,75));
            this.getContentPane().add(B_Aston);

            B_Ferrari.setBounds(new java.awt.Rectangle(270,30,230,75));
            this.getContentPane().add(B_Ferrari);

            B_Lambo.setBounds(new java.awt.Rectangle(30,110,230,75));
            this.getContentPane().add(B_Lambo);

            B_McLaren.setBounds(new java.awt.Rectangle(270,110,230,75));
            this.getContentPane().add(B_McLaren);

            add(B_Aston);
            add(B_Ferrari);
            add(B_Lambo);
            add(B_McLaren);

            Aston1.setBounds(30, 250, 230, 75);
            Aston1.setVisible(false);
            Ferrari1.setBounds(30, 250, 230, 75);
            Ferrari1.setVisible(false);
            Lambo1.setBounds(30, 250, 230, 75);
            Lambo1.setVisible(false);
            McLaren1.setBounds(30, 250, 230, 75);
            McLaren1.setVisible(false);

            Aston2.setBounds(30, 350, 230, 75);
            Aston2.setVisible(false);
            Ferrari2.setBounds(30, 350, 230, 75);
            Ferrari2.setVisible(false);
            Lambo2.setBounds(30, 350, 230, 75);
            Lambo2.setVisible(false);
            McLaren2.setBounds(30, 350, 230, 75);
            McLaren2.setVisible(false);

            add(Aston1);
            add(Ferrari1);
            add(Lambo1);
            add(McLaren1);

            add(Aston2);
            add(Ferrari2);
            add(Lambo2);
            add(McLaren2);

            B_Aston.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    Aston1.setVisible(true);
                    Ferrari1.setVisible(false);
                    Lambo1.setVisible(false);
                    McLaren1.setVisible(false);
                }
            });
            B_Ferrari.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e){
            Aston1.setVisible(false);
            Ferrari1.setVisible(true);
            Lambo1.setVisible(false);
            McLaren1.setVisible(false);
            }
            });
            B_Lambo.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    Aston1.setVisible(false);
                    Ferrari1.setVisible(false);
                    Lambo1.setVisible(true);
                    McLaren1.setVisible(false);
                }
            });
            B_McLaren.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    Aston1.setVisible(false);
                    Ferrari1.setVisible(false);
                    Lambo1.setVisible(false);
                    McLaren1.setVisible(true);

                }

            });

        }

    }

嘿,我是Java新手并获得此代码。所以,这里的问题是,我想选择其中两个图像并在按钮下方绘制它们以模拟比赛。当我单击任何Jbutton时,该图像是可见的而其他3图像不可见,但我无法弄清楚如何离开该选择并使用相同的JButton进行下一个选择。谁能帮我?我读过许多帖子和许多其他页面,但似乎没有找到答案。

谢谢,抱歉格式,不习惯论坛格式化。

3 个答案:

答案 0 :(得分:2)

我认为最简单的方法是检查是否已经进行了第一次选择然后再进行第二次选择,例如

if (playerA == null) {
    playerA = buttonSelection;
} else {
    playerB = buttonSelection;
}

此外,您还需要一些方法来指导用户使用什么按钮进行选择。

答案 1 :(得分:2)

一种可能的解决方案(我不是特别喜欢)是使用布尔值或其他变量来保存程序状态,比如称为boolean autoSelected = false;。选择自动后,将此变量更改为true。在JButton的ActionListener中,使用if块来确定代码应根据此变量的状态执行的操作。换句话说,您可以根据程序的 state 更改JButtons执行的操作。

更好但是在我看来只是简单地使用CardLayout交换JPanel并显示一个保存你的轨道和新JButton的JPanel。这是因为你正在改变你的程序的一个主要状态 - 设置游戏,到另一个状态 - 显示比赛,这些可能需要在完全不同的JPanels中显示。

答案 2 :(得分:1)

为此,我倾向于在其下方使用JList禁用JButton Start Race

将图像放入列表并添加list selection listener以检测选择。选择更改后,请检查selected values array (1.6)selected values list (1.7+)的列表并计算条目。

  1. 如果数字等于1,请鼓励用户选择另一个(使用主GUI中的消息JLabel,弹出窗口或JOptionPane)。
  2. 如果数字等于2,请启用按钮。
  3. 如果选择了3个或更多,请禁用该按钮并显示基于JOptionPane的错误消息,效果为“此曲目对于3辆汽车来说不够大!”。