如何将动作侦听器设置为3个按钮

时间:2014-07-29 05:01:30

标签: java swing listener actionlistener action-interface

我试图用三个按钮制作一个秒表,"开始","暂停"和"停止"。我的讲师只教我们如何将动作监听器设置为两个按钮。如何将动作侦听器设置为三个按钮?这是我到目前为止的编码

JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");

startButton.addActionListener(this);
stopButton.addActionListener(this);

public void actionPerformed(ActionEvent actionEvent) {
    Calendar aCalendar = Calendar.getInstance();
    if (actionEvent.getActionCommand().equals("Start")){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );

    }
}

我还没有为我的" Pause"制作任何动作听众。功能还没有,因为我不知道如何暂停计时器。但是在我弄清楚如何暂停之前,我想将动作链接到按钮。

3 个答案:

答案 0 :(得分:3)

您要找的是if-then-else if-then声明。

基本上,将ActionListener添加到您正在执行的所有三个按钮...

JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");

startButton.addActionListener(this);
stopButton.addActionListener(this);
pauseButton.addActionListener(this);

然后提供if-else-if系列条件来测试每种可能的事件(您期望的)

public void actionPerformed(ActionEvent e) {
    Calendar aCalendar = Calendar.getInstance();
    if (e.getSource() == startButton){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else if (e.getSource() == stopButton) {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );
    } else if (e.getSource() == pauseButton) {
        // Do pause stuff
    }
}

仔细查看The if-then and if-then-else Statements了解更多详情

您可以考虑使用actionCommand的{​​{1}}属性,而不是尝试使用对按钮的引用,这意味着您无需引用原始按钮。 ..

AcionEvent

这也意味着您可以重复使用public void actionPerformed(ActionEvent e) { Calendar aCalendar = Calendar.getInstance(); if ("Start".equals(e.getActionCommand())){ start = aCalendar.getTimeInMillis(); aJLabel.setText("Stopwatch is running..."); } else if ("Stop".equals(e.getActionCommand())) { aJLabel.setText("Elapsed time is: " + (double) (aCalendar.getTimeInMillis() - start) / 1000 ); } else if ("Pause".equals(e.getActionCommand())) { // Do pause stuff } } 来处理ActionListener之类的内容,只要它们具有相同的JMenuItem ...

现在,说了这些,我建议你不要遵循这个范例。通常情况下,我建议您使用actionCommand的API,但这对于您现在所处的位置来说可能有点过于先进,相反,我会鼓励您利用Java's anonymous class支持,例如....

Action

这将每个按钮的责任隔离到单个startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start = aCalendar.getTimeInMillis(); aJLabel.setText("Stopwatch is running..."); } }); stopButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { aJLabel.setText("Elapsed time is: " + (double) (aCalendar.getTimeInMillis() - start) / 1000); } }); pauseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // Do pause stuff } }); ,这样可以更容易地查看正在发生的事情以及何时需要,可以毫无顾虑地修改它们或影响其他按钮。

它也不需要维护对按钮的引用(因为它可以通过ActionListener ActionEvent属性获得)

答案 1 :(得分:2)

如果您不想实现ActionListener,可以像这样在按钮中添加匿名监听器:

 JButton startButton = new JButton("Start");
 JButton stopButton = new JButton("Stop");
 JButton pauseButton = new JButton("Pause");
 startButton.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //start action logic here
        }
    });
 stopButton.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //stop action logic here
        }
    });
 pauseButton.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //action logic here
        }
    });

这个解决方案必须工作:)

答案 2 :(得分:0)

创建按钮后,您需要添加的所有内容。

startButton.setActionCommand("Start");
stopButton.setActionCommand("Stop");
pauseButton.setActionCommand("Pause");

并且在actionPerformed方法中使用它。

switch(actionEvent.getActionCommand())
{
// cases
}