- 1
- 2
-
Anonim
otóż mam taki problem: mam obiekt klasy dziedziczącej po JApplecie - w trakcie działania programu muszę wielokrotnie podmieniać MouseListener i MouseMotionListener tego obiektu (czasem będzie to null a czasem jeden z moich MouseListenerów - działanie każdego z moich MouseListenerów jest całkowicie odmienne - zdecydowanie nie mogą być połączone w jedną klasę).
no więc proste removeMouseListener() i addMouseListener() nie działa poprawnie (tzn działają ale dają _bardzo_ nieoczekiwane efekty, a po chwili 100% zużycia procesora i literalnie setki wyjątków).
No więc jak poprawnie podmienić MouseListener'a? lub ewentualnie ominąć ten problem? any thoughts? -
Adept
a co stoi na przeszkodzie żeby różne działanie listenerów umieścić w blokach instrukcji warunkowych?? bo ja nie rozumiem czemu tak nie zrobiłes... -
Anonim
bo każdy listener ma ZDECYDOWANIE odmienne działanie - dopiero napisałem pierwszego a on ma 150 linii kodu...
- nie chcę sobie robić siana z kodu, podmiana listenera byłaby dużo sensowniejsza i klarowniejsza ("teraz ten panel działa tak; zmiana; a teraz ten sam panel działa na tej samej zawartości inaczej")
jeśli nie wykombinuję z czym jest problem to w ostateczności wyląduję na blokach ale to będzie... meh -
Maciek Makowski
Rozwiazaniem posrednim byloby zrobienie jednego listenera, ktory stanowilby fasade i ktorego bys nie podmienial -- tylko w samym listenerze zmienialbys obiekt implementujacy "strategie" obslugi myszy. Nie wyglada to zbyt madrze (jest przekombinowane), ale jezeli rzeczywiscie nie daloby sie podmienic listenera, to da w miare przejrzysty kod. -
-
Adept
no ale co z tego że 150 linii?? może nawet mieć milion!! dajesz każde działanie w osobnej metodzie i tylko wywołujesz daną metode przekazując jej MouseEvent...
if (flaga ==1){
metoda1(e);
}
else if (flaga==2){
metoda2(e);
}
moim zdaniem to rozwiązanie jest całkiem niezłe... zwłaszcze jeśli nie potrafisz inaczej... -
spec
-
steelheart
Strategie = yes
milion lini + harmonie if-else = No (chyba ze chcesz sie zatrudnic w comarchu albo infovide :P) -
Adept
lini kodu akurat przy ifach będzie akurat mniej niż w rozwiązaniu które chce zrobić kolega.. -
SkiLo
-
mbartyzel
-
mbartyzel
Jednym ze sposobów na utrzymanie porządku w kodzie podczas korzystanie ze swinga jest zastosowanie wzorca Mediator.
Każdą kontrolkę, która ma reagować na jakieś zdarzenie, wyprowadzasz z klasy bazowej i implementujesz w niej interfejs listenera. Metoda listenera wywołuje odpowiednią metodę mediatora.
Przykład: Guzik, który ma coś tam zrobić.
public class Mediator {
private YouButton yourButton;
public void buttonClicked() {
/ /obsluz klikniecie guzika
}
}
public class YourButton extends JButton
implements ActionListener {
Mediator mediator;
public void actionPerformed( ActionEven event ) {
mediator.buttonClicked();
}
}
Oczywiscie, trzeba zainicjowac pola. Ja preferuję injekcję a'al Spring getterami i setterami, ale jak kto woli
Takie roziwązanie pozwala zachować rozsądny porządek w kodzie.
Można również inaczej można użyć kontenera XWork i jego implementacji Swingwork (o ile została juz wypuszczona jakas wersja RC; )) i tez dziala wyśmienicie.
Pozdrawiam.
Michał
-
Anonim
-
Adept
no ale jak to ma działać?? bo ja szczerze mówiąc nie do końca rozumiem jak to ma ominąć blok instrukcji warunkowych -
spec
nie rozumiem jak to sie ma do tematu. wzorzec mediatora.
i tak trzeba dodawac listenera i tak, a ze w klasie Mediator jest zaimplmentowana cala logika ? co z tego ?
tutaj problemy sa raczej techniczne..
(jawka suxx so hard)
-
Adept
gdyby nie ten nawias na końcu zgodził bym się z przedmówcą - zresztą już to wcześniej napisałem -
spec
ja bym to zrobil inaczej... blah
klase w ktorej byla by kolekcja obiektow implementujacych listenera(albo jakis interfejs, wlasny interfejs). ta klasa by implmentowala listenera. routowala calosc do wszyskich obietkow w tej liscie wywolujace metode tego interfejsu.
do samego obietku by sie dodawalo normalnie obiekty, metoda addListener czy cos tam. i juz..
.
-
spec
to pewnie jakis design pattern ale nie pamietam jaki..
zaleta jest taka ze dodajemy raz listenera, a to co dalej sie dzieje z wiadomoscia juz zalezy od tej klasy..
do obektu zawsze mozna dodac badz usunac obiekt
np
setListener(CustomListener l) {}
removeListener(CustomListener l) {}
w kazdym momencie..
(porownujac Comparatorem czy co tam macie, referencje obietku, wsumie to nawet nie trzeba, bo operator == i tak dziala na refencjach, (nie ma zadnego przeciazania, life is suxx))
-
Anonim
no właśnie ja się na początku pytałem jak zrobić żeby podmienić MouseListener bo z moim własnym (dość rozbudowanym) nie działało poprawnie...
a co do ominięcia intrukcji warunkwych: ja chcę je tylko ominąć w sensie syntaktycznym... lubię widzieć co robi mój kod(t) :). -
Anonim
chyba się trochę topic potomny zrobił; ) gdyby ktoś mi odpowiedział: metoda ta i ta powinna działać na 100% i jeśli nie działa to coś masz źle to bym siadł i po raz n-ty nad tym siadł i debugował; ). -
Adept
a co do ominięcia intrukcji warunkwych: ja chcę je tylko ominąć w sensie syntaktycznym... lubię widzieć co robi mój kod(t) :).
if (dupa)
metoda1();
else
metoda2();
czego tu nie rozymiesz??? i nie wiesz?? :/
- 1
- 2
- Przeglądaj grona w kategorii Internet i Komputery
- Przeglądaj grona w okolicy Warszawa
- Załóż własne grono tematyczne
- Zostań moderatorem
Podobne Tematy
|
|
Wszystko co związane z programowaniem w Java (J2EE, JSP, JDBC, itd) test
Miejsca grona (1)
-
Kino Luna ul. Marszałkowska, Warszawa
www.kinoluna.pl kino.luna@maxfilm.com.pl 22 621 78 28
- Dodaj miejsce

