У меня в классе RegistrationFrame, который реализует интерфейс ActionListener, по нажатию на кнопку создается класс Person. В отдельном классе, Test, в отдельном потоке событий, я вызываю конструктор RegistrationFrame, после чего хочу выдернуть из экземпляра класса RegistrationFrame поле с классом Person, следующим образом:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
RegistrationFrame registrationFrame = new RegistrationFrame();
System.out.println(registrationFrame.getPerson().toString());
}
});
}
Очевидно, возникает NullPointerException, потому что программа не ждет нажатия кнопки(по которой создается экземпляр Person), и сразу же после вызова конструктора дергает еще не проинициализированного person. Как заставить программу ждать нажатия на кнопку? Весь jFrame у меня создается внутри конструктора RegistrationFrame, если нужно, могу добавить код.
Можно поступить наоборот: создать слушателя, который будет вызываться при каждом создании Person и с его помощью подписаться на создание объектов из внешнего класса.
Примитивный пример (код не компилировал):
Создаем интерфейс-слушатель
interface PersonListener {
void personCreated(Person person);
}
Добавляем в RegistrationFrame метод добавления слушателя и вызов слушателей при создании Person
class RegistrationFrame ... {
private final List<PersonListener> personListeners = new ArrayList<PersonListener>();
public void addPersonListener(PersonListener listener) {
personListeners.add(listener);
}
private void notifyPersonListeners(Person person) {
for(PersonListener listener: personListeners) {
listener.personCreated(person);
}
}
//... где-то в обработчике кнопки, в котором создается Person
Person person = new Person();
...
notifyPersonListeners(person);
}
В основном потоке слушаем создание Person
RegistrationFrame registrationFrame = new RegistrationFrame();
registrationFrame.addPersonListener(new PersonListener() {
@Override
void personCreated(Person person) {
System.out.println(person.toString());
}
}
Так код по обработке новых объектов будет вызываться только при их создании. В реализацию PersonListener можно вшить вызов другого потока, если требуется.
Продвижение своими сайтами как стратегия роста и независимости