Jakie są najlepsze praktyki programowania Java Swing?

17

Podczas wstępnych badań tego pytania odkryłem, że w Internecie nie ma zbyt dobrze zorganizowanych informacji na temat najlepszych praktyk Java Swing. Więc myślę, że dam Stack Exchange szansę na zbudowanie tej jednej wspaniałej listy.

Jakie są najlepsze praktyki programowania Java Swing? Co znalazłeś dla siebie i dlaczego?

Wyskakuje
źródło
2
Grałem ze Swingiem w szkole i nie było to przyjemne doświadczenie. Wszystko wydawało się nadęte i niepotrzebnie złożone. Najlepszą praktyką może być użycie czegoś innego.
Robert Harvey
1
@RobertHarvey „gra w szkole” jest daleka od dostarczania oprogramowania produkcyjnego. Przekonałem się, że Swing może zrobić wszystko, co było od niego wymagane, w rozsądny, logiczny sposób.
Cóż, ujmując to w ten sposób: Gdyby to było tak trudne w przypadku zwykłego projektu szkolnego, byłoby prawie niewyobrażalnie trudne w przypadku prawdziwego projektu.
Robert Harvey
1
@ Moc Roberta Harvey ma swoją cenę ...
Jeszcze jedna ważna rzecz. Komponenty huśtawki są serializowane i mają wielu przodków. Są więc zbyt ciężkie, aby dziedziczyć w większości przypadków. Powinieneś rozważyć pewną technikę owijania, szczególnie gdy masz stan niemożliwy do zserializowania. Jeśli dziedziczysz po komponencie, użyj go jako widoku (w MVC lub podobnym wzorze).
Dávid Horváth

Odpowiedzi:

12

Mogę tylko odpowiedzieć za to, co dla mnie zadziałało. Inni komentatorzy zwrócili uwagę, że GUI Java ogólnie wpadają w „niesamowitą dolinę” o niezbyt rodzimym wyglądzie i odczuciu, i nie kwestionuję tego.

Dobrze wykorzystaj Action API. Pozwala lepiej łączyć różne działania, które wykona użytkownik, i pozwala znacznie łatwiej łączyć je ze skrótami, klawiszami akceleratora, przyciskami i innymi obiektami wejściowymi.

Użyj odpowiedniego menedżera układu. GridBagLayout jest niezwykle potężny, ale posunąłbym się do stwierdzenia, że ​​nie da się go utrzymać bez nadmiernej ilości komentarzy. Kiedy uruchamiam narzędzia do analizy kodu statycznego, takie jak Sonar, na starszej aplikacji GUI, którą utrzymuję, zawsze wskazuje to na ogromne ilości magicznych liczb, aby układ GridBags był odpowiedni. Odniosłem duży sukces z GroupLayout, który pozwala uniknąć konieczności wyrównywania pikseli.

Jeśli uważasz, że potrzebujesz JDialog ... prawdopodobnie nie. Okna dialogowe są okropne, jeśli chodzi o wrażenia użytkownika - ta aplikacja postanowiła używać ich w każdym menu i formie oraz w dziwaczny sposób egzekwować zawsze obowiązujące reguły. To zamieniło się w koszmar konserwacji, kiedy tak naprawdę musieliśmy coś ostrzec w menu. Sfrustruj kliknięcie w nieokreślalne - a tym samym nie do odrzucenia - okna dialogowe.

W razie potrzeby użyj SwingWorker zamiast zwijania własnej wielowątkowości. Bardzo łatwo jest rozszerzyć SwingWorker i wykonać długie zadanie, zapewniając regularne aktualizacje z powrotem do GUI. Pomyśl o pobraniu aktualizacji klienta. Zajmie się ona planowaniem wątków roboczych dla Ciebie i pozwoli ci opublikować procent pobierania z powrotem do widoku, dzięki czemu możesz zaktualizować pasek postępu lub to, co masz.

To wszystko, co mogę zasugerować, w moim, co prawda, ograniczonym doświadczeniu.

Tom G.
źródło
2
JDialogjest całkowicie w porządku - o ile używasz go do dialogów.
Jonas
1
Zgadzam się, że nic im nie jest, jeśli używasz ich do informacji, które absolutnie muszą zostać natychmiast zauważone i zareagowane. Ale większość informacji tak naprawdę nie musi zakłócać komfortu użytkowania. To był punkt za moim kwalifikatorem.
Tom G
@Jonas Myślę, że chodzi o to, że okna dialogowe są złą rzeczą (niezależnie od tego, czy są zaimplementowane JDialogczy nie).
Tom Hawtin - tackline
1
Sprzężenie jest trochę śmierdzące, ale lepiej IMO niż pisanie własnego kodu wątku. Wolę radzić sobie z nieelegacyjnym kodem niż subtelnymi błędami wątków.
Tom G
3
Możesz spojrzeć na MigLayout - miglayout.com
4

Powiedziałbym, że jedną z pierwszych rzeczy nie jest bezpośrednie działanie. Układ w Swing (IMHO) jest okropny, a próba stworzenia z niego jakiejkolwiek znaczącej aplikacji to koszmar.

Dwoma z wielu alternatywnych menedżerów układu , których użyłem, są układy MigLayout i MultiSplitPane. MigLayout ma bardziej ogólny cel i sprawia, że ​​każdy układ, o którym myślisz, jest łatwy i zdrowy. MultiSplitPane jest bardziej szczegółowy; Użyłem go do stworzenia prostych układów graficznych dla GUI, które nie były zbyt skomplikowane.

EDYCJA : To nie zastępuje zamachu . Jeśli musisz użyć Swing, nadal możesz używać tych menedżerów układu, ponieważ zarządzają one tylko zamachem, a nie zastępują go.


Oczywiście lepszą alternatywą jest po prostu nie używanie Swing. Swing jest mocno krytykowany za okropność w pracy, nie wygląda na rodzimego i powolny. Istnieje wiele alternatyw, które nauczyły się od swingu tego, czego nie robić, jak Qt, SWT, i myślę, że nawet GTK. Są to świetne długoterminowe rozwiązania problemów związanych z bólem głowy Swinga

EDYCJA : Jak powiedział @Lord Torgamus, nie są one tak naprawdę dostępne, jeśli jesteś zmuszony użyć Swinga. Jeśli zamierzasz je wykorzystać, najlepiej to załatwić podczas tworzenia projektu, a nie 3/4 na drodze lub podczas pobierania starszych aplikacji.

Chciałbym również zauważyć, że większość alternatywnych GUI korzysta z bibliotek natywnych, aby wyglądać jak system operacyjny, a następnie wrócić do Swinga lub innego GUI Pure Java.

TheLQ
źródło
4
Doceniam twoją opinię, ale „nie używaj Swinga” nie jest pomocne dla osób, które kończą na tym pytaniu, ponieważ są zmuszone do korzystania z Swinga z tego czy innego powodu.
Wyskakuje
@ Lord Właśnie dlatego zasugerowałem alternatywne menedżery układu przed zaproponowaniem QT i SWT. Użyj dowolnej ścieżki.
TheLQ
„Układ w Swing (IMHO) jest okropny, a próba stworzenia z niego jakiejkolwiek znaczącej aplikacji to koszmar”. Menedżerowie układów zwykle pochodzą z AWT, a nie Swing. To prawda, istnieje kilka specyficznych dla Swinga, takich jak BoxLayout i GroupLayout. Powiedziawszy to, menedżerowie układów są całkowicie opcjonalni ... możesz zamiast tego określić współrzędne dla każdego komponentu, tak jak robisz to w .NET WinForms (z wyjątkiem .NET ma fajny graficzny interfejs użytkownika do zrobienia tego za Ciebie).
Władca 25.01.11
3
Rzuć okiem na MigLayout - miglayout.com
1
@TheLQ Ok Zgadzam się z menedżerem plików Swinga, ten jest naprawdę głupi (także w Mac OS X). W każdym razie po prostu używam menedżera plików AWT, aby to naprawić. Działa dobrze, nawet jeśli reszta aplikacji jest wykonana za pomocą Swing.
stommestack