Swing, czyli poradnik „Jak zrobić beznadziejną bibliotekę do GUI”

7

Na początku powiem może czym jest Swing. Otóż Swing jest to ulepszona wersja biblioteki AWT, służącej do tworzenia GUI w Javie. Obecnie Swing jest w zasadzie jedyną sensowną biblioteką do GUI dla Javy, niestety. Jest aktualnie rozwijany przez firmę Oracle, która rozwija również platformę, na której działa Swing – Javę. Swing jest więc rozwijany przez aktualnego właściciela Javy. Jest to bardzo dobrze z punktu widzenia programisty. Dlaczego więc Swing jest zły? Otóż…

Swing na pewno nie jest najgorszą biblioteką do GUI. Oferuje ciekawe możliwości, jest wieloplatformowa, integruje się z systemem (mówię tutaj m.in. o wyglądzie aplikacji), ogólnie jest to bardzo fajna biblioteka. Ma jednak kilka bardzo, bardzo, ale to bardzo poważnych wad, których w na tyle profesjonalnej bibliotece nie powinno być.

Pierwszą wadą, jaką chciałbym napisać są layout managery. Layout managery układają widżety według określonego schematu. Np. w GTK+ 3.0 mamy GtkBox (czyli odpowiednik GtkHBox i GtkVBox w GTK+ 2.x), GtkGrid (czyli GtkTable), GtkAlignment i… to wystarcza do stworzenia niemal każdego GUI. A jak nie, to zawsze jest jeszcze GtkFixed, czyli ustawianie widżetów jak się chce. Natomiast co mamy w Swingu? Otóż w Swingu sytuacja wygląda nieco inaczej. W Swingu bowiem mamy: BorderLayout, BoxLayout, CardLayout, FlowLayout, GridBagLayout, GridLayout, GroupLayout i SpringLayout. Czyli w GTK+ mamy 3 główne layout managery (są jeszcze inne, ale nie będziemy się nimi w tej chwili zajmować), natomiast w Swingu… 8. Nie mam nawet pojęcia, do czego służą 3 z nich. I kolejne porównanie do GTK+: BoxLayout to taki trochę odpowiednik GtkBoksa, GridLayout to takie coś pomiędzy GtkBoksem, a GtkGrid, FlowLayout – sam nie wiem, GridBagLayout to jest taki czysty GtkGrid, tylko gorszy, a BorderLayout… BorderLayout to w żadnej bibliotece do GUI nie widziałem nawet. Ustawia on widżety na 4 brzegach rodzica + jeszcze jeden w środku. Na stronie oficjalnego tutoriala Swinga znajdziecie screena. To jest totalny bezsens. I zawsze, jak mam napisać jakiś program w Swingu, to się wkurzam, bo nie mogę dobrać odpowiedniego layout managera…

Następną rzeczą, która jest moim skromnym zdaniem źle zrobiona, to są zdarzenia. W innej, profesjonalnej bibliotece do GUI (żeby już nie faworyzować tak GTK+ 🙂 ), konkretnie Qt, zdarzenia oparte są na sygnałach. Np. QPushButton – wysyła sygnał clicked, gdy użytkownik go wciśnie. I można potem taki sygnał bardzo łatwo przechwycić. Natomiast w Swingu mamy to rozwiązane w inny (czytaj: gorszy) sposób. Otóż podpinamy sobie Listenera (w tym przypadku ActionListenera) do takiego naszego JButtona. Kolejne, bezsensowne rozwiązanie, którego nie ma również w żadnej innej profesjonalnej bibliotece do GUI.

Kolejną poważną wadą Swinga jest brak możliwości wczytywania GUI z pliku. W GTK+ mamy pliki GtkBuildera, w Qt mamy pliki .ui. Oba te formaty są oparte na XML-u. Natomiast co mamy w Swingu? W Swingu, niestety, nic nie mamy. Aczkolwiek wydaje mi się, że aby dodać taką możliwosć, tj. wczytywanie GUI z pliku, i żeby to miało jakąś sensowną funkcjonalność, to najpierw trzeba by było napisać praktycznie całą tę bibliotekę od podstaw, tym razem używając m.in. opisanych już sygnałów.

Następną rzeczą, rzucającą się w oczy głównie na Linuksie, jest okropna szybkość działania Swinga przy ustawionej integracji wyglądu z systemem – GtkLookAndFeel. Nie dość, że ten wygląd GTK+ Swing udaje raczej beznadziejnie („look” to jeszcze, chociaż i tak słabo, ale „feel” to już w ogóle…), to jeszcze ta szybkość… Plus za wspieranie Linuksa, ale dwa minusy za to, jak on jest wspierany, niestety.

To już koniec mojej krytyki biblioteki do GUI, jaką jest Swing. Mam nadzieję, że chociaż trochę przybliżyłem Wam to, jak NIE powinno się pisać tego typu bibliotek. Jak widać, nawet tak znana i ceniona firma Oracle (właściwie to Sun) potrafi napisać coś, z czego z trudem się korzysta. A jest się – można powiedzieć – skazanym na korzystanie z tego. Cóż, niestety.

Pozdrawiam 🙂

7 komentarzy

  1. mati

    Kpisz sobie?Ustaw layout na null, a będziesz mógł ustawiać kontrolki jak chcesz i gdzie chcesz, bez tych „głupich” layoutów, które imo są bardzo dobrym rozwiązaniem.

    Odpowiedz
    • m4tx

      admin

      No wiesz, ale jak już robi się layout managery to chyba po to, żeby z nich korzystać. 😛 Owszem, można ustawiać widżety po pikselach, ale… Nie uważasz, że to trochę bez sensu?

      Odpowiedz
      • THX

        Narzekanie na layouty w Swingu wynika wyłącznie z braku doświadczenia w ich użytkowaniu. Jeśli ktoś nie wie do czego służą 3 layouty w Swingu to znaczy, że ich nie potrzebuje. Tak czy inaczej jest podstawowy – główny – layout Swinga (GridBagLayout), w którym można stworzyć każdy układ – w użyciu jest prosty (wbrew powszechnym opiniom ludzi, którzy znów nie zadali sobie trudu, żeby ten layout przyswoić). Problem jedynie w tym, że trzeba się napisać – ale korzysta się z niego wtedy kiedy chce się zrobić layout, który trudno sklasyfikować jako uniwersalny – chce ktoś siatkę to po prostu GridLayout. Ale jeśli ktoś nie lubi kategoryzować, to GridBagLayout wystarczy do wszystkiego.

        Odpowiedz
        • m4tx

          admin

          Ano właśnie – dla mnie największą wadą w GridBagLayoucie jest to, że tak jak mówisz – trzeba się opisać i kod się staje okropnie nieczytelny. W SWT jest znacznie lepiej, choć i tak nie jest idealnie. Idealnie jest w GTK+, gdzie mamy najkrótszy (== najczytelniejszy) kod. Choć i tak – podstawową wadą jak dla mnie w Swingu jest to, że jest on rysowany. SWT nie jest 🙂

          Odpowiedz
          • Aras

            Wadą dla Ciebie jest, że swing jest rysowany ??? Pozwól że zadam podstawowe pytanie dot. javy:
            – Jaka jest jej największa zaleta ?? Czy nie jej wieloplatformowowść przypadkiem ? Jeśli przeszkadza Ci rysowanie komponentów swinga to z nich nie korzystaj, masz SWT, skromne AWT, możesz też wywołać systemowego LAFa, ale właśnie dzięki „rysowaniu” aplikacja w swingu będzie wyglądać identycznie na każdej platformie. Coś za coś. Nie wiem czy jakakolwiek inna technologia posiada podobą „wadę” (w moim rozumieniu ogromną zaletę)

            I pytanie drugie:
            – Od kiedy to w Swingu nie można dodawać GUI z pliku ?

            Odpowiedz
            • m4tx

              admin

              Najbardziej w rysowaniu kontrolek przeszkadza mi fakt, że zachowują się nijak jak natywne – nie działa Global Menu w Ubuntu, nie działają overlay scrollbars w Ubuntu, nie działają różne fajne animacje (np. jak najedziesz na scrollbary w Windowsie) – można wymieniać godzinami. Swing próbuje jedynie udawać natywny toolkit, ale strasznie kiepsko mu to wychodzi. A użytkownicy nie potrzebują aplikacji, które wyglądają jak by były wyrzygane przez psa.

              Od kiedy to w Swingu nie można dodawać GUI z pliku ?

              To ja zapytam: a od kiedy można? 🙂 I mówię tutaj o jakichś oficjalnych rozwiązaniach czy czymś podobnym, nie potrzebuję projektów które autor porzuci za tydzień.

              Odpowiedz
    • THX

      „bez tych „głupich” layoutów” – ręce opadają. Ciekawe jak ma wtedy działać aplikacja podczas resize’u okna – odstaw alkohol.

      Odpowiedz

Zostaw komentarz

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>