2012-08-03 12 views
6

Mam klasę GUI SWING, która tworzy instancję niestandardowego JPanel dla części ekranu. Ta niestandardowa klasa ma przyciski i pola tekstowe itp. Moja klasa GUI, do której należy niestandardowy JPanel, ma również klasę kontrolera, która obsługuje modyfikację moich modeli danych. Jak mogę przekazać akcje z panelu niestandardowego do jego właściciela (mojej klasy gui), aby obsłużyć zdarzenia?EventListeners i niestandardowe komponenty GUI

Pomyślałem, że być może uda mi się dodać do mojego konstruktora panelu użytkownika odwołanie do mojej klasy kontrolerów w gui, dzięki czemu mogę ustawić ją jako actionListener na moich przyciskach. Czy to podejście jest wskazane? Czy istnieje lepsze podejście?

Odpowiedz

4

Twój kod View (niestandardowy JPanel) powinien mieć pole Controller (lub inny sposób uzyskania klasy kontrolera). W ten sposób, gdy otrzymasz czynność od użytkownika - np. kliknięcie myszką na przycisk - możesz zadzwonić pod numer controller.doTheAppropriateAction(). Przepuść Controller w budowie lub użyj wzorca ustawiającego Javabean i ustaw go zaraz po zbudowaniu w logice uruchamiania (która brzmi jak twoja "klasa GUI"). Preferuję deseń Javabean, ponieważ edytory GUI nie wymagają konstruktorów z parametrami.

Należy zarejestrować View jako Listener do odpowiednich Controller (lub Model) zajęcia, tak, że będziesz automatycznie powiedziawszy kiedy coś się zmieni - tak można repaint() swoje Component s (lub zrobić coś bardziej zaawansowanego). Będzie to wymagało skonfigurowania własnej interface (dla implementacji View) i logiki obsługi słuchacza w Controller (lub Model).

Lombok PG pobiera ostatnią z nich.

akf daje alternatywę: zarejestruj swój Controller jako ActionListener na swoim kodzie View. Zaletą tego podejścia jest to, że twój kod View nie będzie powiązany z konkretnym Controller - ale wadą jest to, że twój Controller będzie powiązany z twoim kodem View. Mam tendencję do ponownego użycia kodu Controller dla różnych implementacji UI (na przykład Swing, GWT, JSP), więc moje Controller s i Model s nigdy nie są zależne od żadnej konkretnej akcji użytkownika atomowego.

+0

+1 za świetne wyjaśnienie – MadProgrammer

2

Możesz przekazać referencję do swojego macierzystego GUI jako ActionListener do swojego panelu niestandardowego. Twój niestandardowy panel może następnie zarejestrować Twoją ActionListener -wykonującą klasę rodzicielską ze wszystkimi przyciskami itp.

Twoja klasa rodzica otrzyma powiadomienie o każdej akcji.

Powiązane problemy