zmienna globalna w actionlistener

0

WItam, jak przeniesc zmienna globalna do actionlistenera?
mam zwykly kawałek kodu:


public void jakas_funkcja(int liczba)
	{

// w tym miejscu zmienna 'liczba' jets odczytywana

 graj.addActionListener(new ActionListener(){ 
	    	                                  
	    	public void actionPerformed(ActionEvent e){
	    		
// tutaj juz nie
	           new gra();
                   
               }});

}

chodzi oczywiscie o zmienna liczba, ktora jest zmienna globalna

1
  1. Od kiedy java ma zmienne globalne? o_O
  2. Jeśli musi to wygladać tak jak napisałeś to liczba musiałaby być final
  3. Zrób nową klasę implementujacą ActionListener i przyjmującą argument w kontruktorze.
0

Nie mniej ważne jest ustalenie czy kilka gier może istnieć równocześnie. Użycie new gra() w reakcji na zdarzenie tworzy za każdym razem nowy obiekt nie czekając na zakończenie/zniszczenie obiektu utworzonego przy poprzednim wywołaniu. Gdyby tak działały gry, to wywołanie nowej gry dawałoby efekt np. utworzenia nowego (kolejnego?) okna z grą. Czy tak powinno być? Zwykle nie.

Jeżeli nowa gra ma zamknąć poprzednią, albo nie powinno być możliwe wybranie nowej gry tuż po poprzednim wybraniu nowej gry (łatwo jest kliknąć ten sam skrót lub menu podwójnie), to czasem potrzebne są aż dwa zabezpieczenia.

Pierwsze to ignorowanie kolejnego zdarzenia kiedy poprzednie nie zakończyło się jeszcze konstruować - może to być niezbędne jeżeli ta sama metoda może zostać wywołana w nowym wątku, zanim zakończyła się ta sama metoda w innym wątku (na szczęście Swing jest jednowątkowy, ale inne systemy GUI wcale takie nie muszą być). W tym celu tuż po wejściu do metody trzeba ustawić jakąś atomową zmienną (może być boolean) gdy obsługa zdarzenia została już rozpoczęta i jeszcze się nie zakończyła. Ma to znaczenie wtedy kiedy komputer będzie przez moment tak mocno obciążony, że drugie odpalenie wywołanie zdarzenia może nastąpić jeszcze zanim dla pierwszego system zdoła wywołać metodę obsługującą (czyli np. actionPerfomed). Takie szczytowe obciążenie może się pojawiać np. podczas ładowania jakiegoś pliku exe przez system (W Windows zwykle przez moment daje to 100% obciążenia czasu jądra, na niektórych komputerach). To rzadki przypadek, ale może się zdarzyć.

Drugie, to jawne wyłączenie możliwości ponownego generowania tego samego zdarzenia kiedy pierwsze nie zostało jeszcze zakończone - zwykle polega to na wyłączeniu wszystkich kontrolek przez które zdarzenie może zostać odpalone - "wyszarzenie" buttona, pozycji menu itp.

W przypadku kiedy nowa gra ma zamknąć istniejącą, kontrolek się nie wyłącza po odpaleniu nowej gry, ale wyłącza się na czas przeprowadzania procedury wyłączania poprzedniej i tworzenia nowej gry, tak aby kolejne zdarzenie nie rozsypało stanu całego programu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1