Джава:Использование прослушивателя действий для вызова функции в другом классе для объекта из этого класса
-
20-09-2019 - |
Вопрос
По сути, я хочу получить кнопку «Пуск», чтобы инициировать метод, работающий в другом классе и действующий на другой объект.
Мой код для слушателя:
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, где можно найти идеи о том, как избежать этой проблемы.