Как использовать слушателей действия в другом классе? - PullRequest
1 голос
/ 21 апреля 2011

Я сейчас нахожусь в процессе разработки настольного приложения.У меня есть строка меню, в которой есть команда RUN с мнемоникой ALT-R.Кроме того, у меня есть кнопка RUN в одном из кадров, и я объявил ActionListener для того же.Есть ли способ использовать тот же ActionListener для пункта меню команды RUN?Или это должно быть повторно объявлено полностью снова??

Ответы [ 4 ]

2 голосов
/ 21 апреля 2011

Рассмотрите возможность хранения всех ваших слушателей в статической карте. Их логика должна быть независимой от любого «внешнего класса», конечно, потому что они должны работать в любом контексте:

public static Map<String, ActionListener> listeners = new HashMap<String, ActionListener>();
static {
  listener.put("RUN", new ActionListener() {
   // implementation of the "Run" actionlistener
  });
  // more listeners
}

и позже:

something.addActionListener(SomeManager.listeners.get("RUN"));
0 голосов
/ 21 апреля 2011

На самом деле другой вариант - использовать ActionLister и настроить класс, содержащий ваши кнопки и другие объекты, или даже использовать ActionListener для виджета пользовательского интерфейса, а затем просто вызывать класс, содержащий логику. Это кажется мне чище с точки зрения ответственности.

JButton myButton = new JButton("RUN");
myButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent ae) {
       myLogicClass.executeRun();
     }
};

public class MyLogicClass {
     public void executeRun() { //or parms if you need it.
       //do something in here for what you want to happen with your action listener.
     }
}

Мне кажется, это чище, поскольку он пытается сохранить интерфейс и логику в отдельных классах. Но это также зависит от того, что «делать что-то» - то, что вы хотите сделать.

0 голосов
/ 21 апреля 2011
    class ActionL implements ActionListener{
   // Here to override
   public void actionhapp(ActionEvent ae) {
     // do your code
   }


   BAction b=new BAction(this);
}

class BAction{
   ActionL a;
   public BAction(A a){
      this.a = a;
   }


}

Вот способ, которым вы можете сделать

0 голосов
/ 21 апреля 2011

Если вы вызываете второй класс сначала, вы можете передать класс, в котором вы реализовали ActionListener, во второй класс.т.е.

class A implements ActionListener{
   @Override
   public void actionPerformed(ActionEvent ae) {
     //--- coding.........
   }

   //--- Somewhere in this class
   B b=new B(this);
}

class B{
   A a;
   public B(A a){
      this.a = a;
   }
   //-- now use this.a where you wanna set actionListener
}

Или вы также можете легко передать его как:

class B{
  //-- Where you want to add ActionListener
    button.addActionListener(new A());
}
...