Джава:Использование прослушивателя действий для вызова функции в другом классе для объекта из этого класса

StackOverflow https://stackoverflow.com/questions/1346978

Вопрос

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

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

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
}

Я чувствую, что это не может быть слишком сложно, но мне не хватает кое-чего.

Это было полезно?

Решение

Один из способов ссылаться на объекты в анонимном классе — использовать метод 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);
  }
}

Другие советы

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

Вы можете либо сделать свой объект финальным (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
}

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top