Использование булевой переменной вместо интерфейса 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();
         }
      });
   }
}
Другие вопросы по тегам