Использование булевой переменной вместо интерфейса ActionListner в свинге
У меня небольшой вопрос, пожалуйста, позвольте мне объяснить сценарий. У меня есть свинг jframe, в котором у меня есть кнопка с именем "start", которая запускает таймер в секундах, поэтому всякий раз, когда я нажимаю на start, она преобразует саму кнопку в "reset", что должно привести к нулю секунд и снова преобразовать себя в "Начните". Меня беспокоит то, что для обоих этих сценариев мне нужно запустить два набора кодов, для которых я использовал два класса, которые реализуют интерфейс ActionListener. Есть ли способ включить эти два набора кодов в один класс, который реализует ActionListener, и переключить блок кода в зависимости от логической переменной, которая меняет свое значение при изменении кнопки.
Я попробовал это, но я столкнулся с проблемами производительности, такими как зависание приложения и даже не работает точно так, как ожидалось.
пожалуйста, просмотрите мой код ниже.
public class SuperTimer extends JFrame
{
JButton start;
private final StartCountDown countdown;
public SuperTimer()
{
countdown= new StartCountDown();
start.addActionListener(countdown);
}
public class StartCountDown implements ActionListener
{
public void actionPerformed(ActionEvent l)
{
if(l.getSource()==start)
{
count = Long.parseLong(input.getText());
start.setText("Reset");
reset = new Reset();
start.removeActionListener(countdown);
start.addActionListener(reset);
invalid.setVisible(false);
}
TimeClass tc = new TimeClass(count);
timer = new Timer(1000,tc);
timer.start();
}
}
public class Reset implements ActionListener
{
public void actionPerformed(ActionEvent j)
{
start.setText("Start");
time.setText("00:00:00");
input.setText("");
timer.stop();
timeup.setVisible(false);
start.removeActionListener(reset);
start.addActionListener(countdown);
}
}
}**
1 ответ
Используйте только один ActionListener или, возможно, лучше, AbstractAction, присвойте ему логическую переменную, а затем измените его состояние на основе логической переменной.
например,
import java.awt.event.ActionEvent;
import javax.swing.*;
public class ActionWithMultipleBehaviors extends JPanel {
private TimerButtonAction timerBtnAction = new TimerButtonAction("Start", "Reset");
private JButton timerButton = new JButton(timerBtnAction);
public ActionWithMultipleBehaviors() {
add(timerButton);
}
class TimerButtonAction extends AbstractAction {
private boolean stateStart = true;
private String name;
private String secondName;
public TimerButtonAction(String name, String secondName) {
super(name);
this.name = name;
this.secondName = secondName;
}
@Override
public void actionPerformed(ActionEvent e) {
String newName;
if (stateStart) {
newName = secondName;
// TODO: add start timer code
} else {
newName = name;
// TODO: add reset timer code
}
putValue(NAME, newName);
stateStart = !stateStart;
}
}
private static void createAndShowGui() {
ActionWithMultipleBehaviors mainPanel = new ActionWithMultipleBehaviors();
JFrame frame = new JFrame("ActionWithMultipleBehaviors");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}