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

java swing listener actionlistener action-interface

1593 просмотра

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

    }
}

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

Автор: SeverelyConfused Источник Размещён: 12.11.2019 09:13

Ответы (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
    }
}

Присмотритесь на КРП-то и если-то-иначе отчетности для получения более подробной информации

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

Сказав это, я бы посоветовал вам не следовать этой парадигме. Как правило, я бы рекомендовал вам использовать ActionAPI s, но это может быть слишком сложным для того, где вы сейчас находитесь, вместо этого я бы рекомендовал вам воспользоваться преимуществами поддержки анонимных классов 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свойство)

Автор: MadProgrammer Размещён: 29.07.2014 05:06

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

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

Автор: mlethys Размещён: 29.07.2014 05:10

0 плюса

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

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

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

switch(actionEvent.getActionCommand())
{
// cases
}
Автор: Styl Размещён: 29.07.2014 09:05
Вопросы из категории :
32x32