Java: использование actionlistener для вызова функции в другом классе на объекте из этого класса - PullRequest
6 голосов
/ 28 августа 2009

В основном я хочу получить кнопку запуска для запуска метода, выполняющегося в другом классе и воздействующего на другой объект.

Мой код для слушателя:

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

Мой код для другого класса:

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

и

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

У меня такое чувство, что это не может быть слишком сложно, но мне не хватает части.

Ответы [ 4 ]

4 голосов
/ 28 августа 2009

Одним из способов ссылки на вещи в анонимном классе является использование ключевого слова final:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

Кроме того, вы можете получить доступ к элементам (переменным или методам) вмещающего типа:

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}
2 голосов
/ 14 февраля 2012

У меня была такая же проблема, как у вас, и вот как я ее решил.

Вы можете сделать свой объект окончательным (final CastleCrash sim = new CastleCrash ();), но я не хотел этого делать, или вы можете создать что-то вроде метода установки для запуска метода в другом классе:

Мой код для класса слушателя:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

Мой код для другого класса:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

Надеюсь, это полезно, удачи! :)

1 голос
/ 28 августа 2009

МакДауэлл уже дает ответы на практические примеры о том, как получить доступ к переменным из прослушивателей событий (или анонимных внутренних классов в целом). Однако есть более общий ресурс Sun для прослушивателей событий в Swing , который является каноническим и дает хороший обзор всех предостережений, которые следует учитывать при их написании.

0 голосов
/ 28 августа 2009

Каким-то образом вам нужна ссылка на ваш объект CastleCrash, доступный для вызова из вашего actionListener.

Возможно, вы хотите создать подкласс JFrame или что-либо, что содержит ваш JButton, так что в нем есть ваш основной метод и свойство CastleCrash, на которое можно ссылаться из вашего анонимного внутреннего класса Actionlistener.

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

См. http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html, особенно о классе SwingWorker, для идей о том, как избежать этой проблемы.

...