Все вызовы о MVC и т. Д. Действительны, но это не так сложно.
То, что вы хотите сделать, находится в вашем Main, вы можете создать свой класс Data (Model), класс, который содержит всю вашу информацию.
Итак, вы можете сделать что-то вроде этого:
public class F1 ... {
private final Data myData;
public F1(Data theData) {
myData = theData;
}
....
}
public class Main {
Data myData;
public static void main(String args[]) {
Main m = new Main();
m.setMyData(new Data());
F1 f = new F1(m.getMyData());
...
}
}
Затем, позже, когда F1 вызывает F2, просто сделайте то же самое - создайте F2 с данными, переданными ранее конструктором. Таким образом, когда каждый фрейм работает, все они работают с одним и тем же экземпляром данных. Когда все будет сделано, единственный экземпляр Data останется в классе Main, чтобы вы могли делать то, что хотите.
Существуют лучшие способы реорганизации всей вашей программы, но это должно дать вам идеи о том, как преодолеть трудности, которые у вас сейчас есть.
Дополнения:
Есть несколько вещей, которые вы можете сделать.
Когда вы получаете ActionEvent, он содержит источник. Этот источник является компонентом, сгенерировавшим событие (скорее всего, Button в этом случае). Если вы знаете, где находится кнопка в иерархии вещей, вы попадаете в свой фрейм напрямую. В примере вставки у вас есть Frame -> Panel -> Button. Итак, если у вас есть кнопка, вы можете добраться до фрейма.
public void actionPerformed(ActionEvent e) {
JButton sourceButton = (JButton)e.getSource();
F1 f1 = (F1)sourceButton.getParent().getParent();
Data myData = f1.getMyData();
data.setField(...);
}
Опять же, это не рекомендуемые способы ведения дел. В уроках есть достойные примеры использования MVC и слушателей изменения свойств, а также весь комплект. Но это должно привести вас туда, куда вы хотите пойти.