U Ciebie f
jest zmienną lokalną. Zmień ją na pole i skoro ma się odwoływać do różnych obiektów JFrame
nie może być final. Podkreślanie final
wynika z tego, że w klasie anonimowej można się odwoływać do zmiennych lokalnych i argumentów metod tylko gdy są finalne. Jednak Tobie to nie jest potrzebne, ani nie ma sensu.
Poza tym nie widzę aby p2 było elementem, albo miało choćby coś wspólnego z obiektem, który jest przypisywany zmiennej f
. W efekcie nie ma możliwości, aby jakiś button, którego akcję chcesz obsłużył wygenerował zdarzenie dla tego okna.
Na przyszłość będzie Ci łatwiej jeżeli wprowadzisz zasadę, że wszelkie kontrolki, które musisz obsłużyć/zmienić będą polami klas, a nie zmiennymi lokalnymi.
Pamiętaj też, że hierarchia okien, paneli i kontrolek GUI nie ma nic wspólnego z hierarchią klas, które tworzysz/używasz. Ich wzajemne powiązania tworzą się przez polecenia takie jak add
i różne setXXX
. Jeżeli nie będą one spójne z Twoją hierarchią klas, to dostaniesz w efekcie kompletny bajzel, w którym się pogubisz - mniej więcej tak jak teraz, tylko bardziej. :)
To nie znaczy, że nie da się zrobić GUI Swinga wyłącznie na zmiennych lokalnych - da się, ale będziesz musiał sięgać do poszczególnych kontrolek przez metody takie jak np. getParent
, getComponents
. Mało wygodne, łatwe do zabłądzenia. :)