Как установить Action Listener на 3 кнопки

Я пытаюсь сделать секундомер с тремя кнопками "Пуск", "Пауза" и "Стоп". Мой инструктор только научил нас, как установить Action Listeners на две кнопки. Как настроить Action Listeners на три кнопки? Вот мое кодирование до сих пор

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

    }
}

Я еще не сделал никаких прослушивателей действий для своей функции "Пауза", потому что я все равно не знаю, как приостановить таймер. Но я хотел связать действие с кнопкой, прежде чем я понял, как сделать паузу.

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

Это также означает, что вы можете повторно использовать 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, что позволяет легче видеть, что происходит, и, когда требуется, изменять их без страха или влияния на других.

Это также устраняет необходимость сохранять ссылку на кнопку (как это можно получить с помощью ActionEventgetSource имущество)

Если вы не хотите реализовывать 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
        }
    });

И это решение должно работать:)

Все, что вам нужно добавить, это после создания кнопок.

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

и в методе actionPerformed используйте это.

switch(actionEvent.getActionCommand())
{
// cases
}
Другие вопросы по тегам