Программная генерация Actionevent в Java - PullRequest
3 голосов
/ 23 июля 2011

Я делаю приложение. в Java, в котором есть кнопка, к которой я добавил actionlistener. ActionEvent, которую он (кнопка) генерирует, выполняет некоторый код. Теперь я хочу, чтобы этот фрагмент кода запускался всякий раз, когда приложение. запускается и без нажатия кнопки. Я хочу создать Actionevent (без нажатия кнопки), чтобы фрагмент кода, содержащийся в ActionPermed, выполнялся как приложение. Начните. После этого он может запускаться всякий раз, когда я нажимаю кнопку.

Ответы [ 4 ]

3 голосов
/ 23 июля 2011

Вы можете создавать ActionEvents, как и любой другой Java-объект, просто используя конструктор. И затем вы можете отправить их непосредственно компоненту с помощью Component.processEvent (..)

Однако в этом случае я думаю, что вам лучше превратить ваш код в отдельную функцию, которая называется обеими:

  • С помощью ActionListener при нажатии кнопки
  • Непосредственно по коду запуска вашего приложения (возможно, с помощью SwingUtilities.invokeLater () или SwingUtilities.invokeAndWait (), если вам нужно, чтобы это происходило в потоке обработки событий)

Таким образом, вы не смешиваете логику представления с бизнес-логикой того, что делает код ....

2 голосов
/ 23 июля 2011

Да, это можно сделать, но на самом деле это не имеет смысла, поскольку ваша цель не в том, чтобы нажать кнопку или вызвать код ActionListener, а в том, чтобы иметь общее поведение при нажатии кнопки и при запуске программы , Для меня лучший способ добиться этого - иметь метод, который вызывается как методом actionPerformed ActionListener, так и классом при запуске.

Вот простой пример. В приведенном ниже коде метод отключает кнопку, превращает JPanel в зеленый цвет и запускает таймер, который через 2 секунды включает кнопку и сбрасывает цвет фона JPanel по умолчанию. Метод, вызывающий такое поведение, вызывается как в конструкторе основного класса, так и в методе actionPerformed JButton's ActionListener:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ActionOnStartUp extends JPanel {
   private static final int PANEL_W = 400;
   private static final int PANEL_H = 300;
   private static final int TIMER_DELAY = 2000;
   private JButton turnGreenBtn = new JButton("Turn Panel Green for 2 seconds");;

   public ActionOnStartUp() {
      turnPanelGreen();

      turnGreenBtn.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            turnPanelGreen();
         }
      });
      add(turnGreenBtn);
   }

   public void turnPanelGreen() {
      setBackground(Color.green);
      turnGreenBtn.setEnabled(false);
      new Timer(TIMER_DELAY, new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
            setBackground(null);
            turnGreenBtn.setEnabled(true);
            ((Timer) ae.getSource()).stop(); // stop the Timer
         }
      }).start();
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PANEL_W, PANEL_H);
   }

   public static void createAndShowGui() {
      JFrame frame = new JFrame("Foo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new ActionOnStartUp());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
1 голос
/ 28 июля 2012

Просто позвоните JButton.doClick () , он должен запустить ActionEvent, связанный с JButton.

1 голос
/ 23 июля 2011

Обычно событие действия кнопки реагирует на внешнее событие, чтобы уведомить приложение о том, что пользователь (или, скорее, что-то или кто-то) взаимодействовал с приложением.Если ваша кнопка выполняет какой-то код, который вы также хотите выполнить при запуске приложения, почему бы просто не поместить все в нужное место?кнопка с чем-то вроде

public void setButtonAction(final SOmeSharedObject obj) {
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) { 
            obj.executeSomeCode();
        }
    });
}

и запускать при запуске приложения с чем-то вроде

public void initApplication(SomeSharedObject obj) {
    obj.executeSomeCode();     
}

И, если для выполнения кода требуется некоторое время, вы можетеиспользуйте отдельный поток внутри события actionPerformed, чтобы пользовательский интерфейс вашего приложения не зависал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...