2

我正在尝试制作一个带有三个按钮的秒表,“开始”、“暂停”和“停止”。我的导师只教我们如何将动作监听器设置为两个按钮。如何将动作侦听器设置为三个按钮?到目前为止,这是我的编码

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 );

    }
}

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

4

3 回答 3

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
    }
}

仔细查看if-then 和 if-then-else 语句以获取更多详细信息

与其尝试使用对按钮的引用,不如考虑使用 的actionCommand属性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
    }
}

这也意味着您可以重复使用 s 之类的ActionListener东西JMenuItem,只要它们具有相同的actionCommand...

现在,话虽如此,我鼓励你不要遵循这种范式。通常,我会鼓励您使用Actions API,但这对于您现在的能力来说可能有点太高级了,相反,我会鼓励您利用Java 的匿名类支持,例如... .

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 getSource属性获得)

于 2014-07-29T05:06:24.397 回答
2

If you don't want to implement ActionListener you can add anonymous listener to your button like this:

 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
        }
    });

And this solution have to work :)

于 2014-07-29T05:10:41.537 回答
0

您需要在按钮创建之后添加它。

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

并在 actionPerformed 方法中使用它。

switch(actionEvent.getActionCommand())
{
// cases
}
于 2014-07-29T09:05:35.497 回答