AWT i Swing Layout Managers AWT i Swing

  • Slides: 34
Download presentation
AWT i Swing, Layout Managers AWT i Swing - Jacek Rudzński

AWT i Swing, Layout Managers AWT i Swing - Jacek Rudzński

Krótka historia AWT i Swing AWT (Abstract Window Toolkit) powstało aby umożliwić programiście stworzenie

Krótka historia AWT i Swing AWT (Abstract Window Toolkit) powstało aby umożliwić programiście stworzenie interfejsu, który by wyglądał dobrze na wszystkich platformach. Niestety, AWT z Java 1. 0 tworzył GUI (graficzny interfejs użytkownika), który wręcz przeciwnie wygląda źle we wszystkich systemach. Można było używać tylko 4 czcionek i nie było dostępu do bardziej wyszukanych elementów GUI, mimo iż istniały w danym systemie operacyjnym. Poprawa sytuacji nastąpiła przy wprowadzeniu standardu Java. Beans (komponentowy model programowania, ukierunkowany na łatwe wykorzystanie w środowiskach programistycznych) w Java 1. 1 Natomiast w Javie 2. 0 pojawiła się jak na razie najlepsza, choć pewnie ostateczna biblioteka GUI dla Javy jaką jest Swing. AWT i Swing - Jacek Rudzński

Dlaczego stosować AWT? Aby rozpocząć pisanie z zastosowaniem AWT do tworzenia GUI musimy napisać:

Dlaczego stosować AWT? Aby rozpocząć pisanie z zastosowaniem AWT do tworzenia GUI musimy napisać: import java. awt. *; Dlaczego AWT? ü Łatwy ü Prosty w implementacji ü Na etapie nauki daje najszybciej efekty ü Nawet tworząc GUI Swingiem często musimy importować AWT, gdyż w bibliotece java. awt. * są między innymi definicje Layout-ów (o czym parę slajdów dalej) a w java. awt. event. * obsługa zdarzeń. Największą wadą AWT jest: ü Różny wygląd na różnych platformach AWT i Swing - Jacek Rudzński

Dlaczego stosować Swinga? W większości przypadków gdy korzystamy ze Swinga piszemy: import javax. swing.

Dlaczego stosować Swinga? W większości przypadków gdy korzystamy ze Swinga piszemy: import javax. swing. *; import java. awt. *; // opcjonalnie import java. awt. event. *; Dlaczego Swing? ü Lepszy wygląd komponentów niż w AWT ü Na wszystkich platformach wygląda tak samo (niezależny od systemu) ü Button-y i Label-e mogą oprócz tekstu wyświetlać także obrazki ü Komponenty Swinga nie muszą być prostokątne UWAGA: Nie należy w programach mieszać komponentów AWT i Swinga! AWT i Swing - Jacek Rudzński

Porównanie niektórych komponentów AWT i Swing AWT Swing Frame JFrame Button JButton Label JLabel

Porównanie niektórych komponentów AWT i Swing AWT Swing Frame JFrame Button JButton Label JLabel Text. Field JText. Field Panel JPanel Check. Box JCheck. Box Applet Jak widać sporo komponentów Swinga jest po prostu pochodną komponentów AWT – nazwy różnią się niewiele, gdyż w Swingu dodano literę J przed nazwą komponentu. Oczywiście Swing jako, że bardziej rozbudowany posiada komponenty, które nie mają swojego odpowiednika w AWT – np. JTable AWT i Swing - Jacek Rudzński

Dodawanie komponentów W AWT, gdy chcemy dodać komponent stosujemy metodę add(). Natomiast w Swingu

Dodawanie komponentów W AWT, gdy chcemy dodać komponent stosujemy metodę add(). Natomiast w Swingu powinniśmy najpierw komponenty opakować w pojemnik, czyli Container. Komponenty JApplet, JFrame, JWidnow, JDialog przez metodę get. Content. Pane(), zwracają obiekt klasy Container, który będzie zawierał nasze komponenty. Swing AWT i Swing - Jacek Rudzński

Layout Managers W Javie mamy wiele możliwych sposobów rozmieszczenia komponentów w GUI, a służą

Layout Managers W Javie mamy wiele możliwych sposobów rozmieszczenia komponentów w GUI, a służą do tego menadżery układu (z ang. layout managers). Oto niektóre z nich: ü Flow. Layout ü Border. Layout ü Grid. Layout ü Card. Layout ü Grid. Bag. Layout ü Box. Layout AWT i Swing - Jacek Rudzński

Flow. Layout wypełnia panel komponentami od lewej do prawej, aż zostanie zapełniona przestrzeń, następnie

Flow. Layout wypełnia panel komponentami od lewej do prawej, aż zostanie zapełniona przestrzeń, następnie przechodzi do następnego wiersza i kontynuuje zapełnianie. Zmiana kształtu i rozmiaru appletu powoduje zmianę w układzie panelu. AWT i Swing - Jacek Rudzński

Konstruktory Flow. Layout() Ø konstruktor domyślny – ustawia 5 pikseli odstępu pomiędzy komponentami Flow.

Konstruktory Flow. Layout() Ø konstruktor domyślny – ustawia 5 pikseli odstępu pomiędzy komponentami Flow. Layout(int alignment) Ø wciąż 5 pikseli, lecz jest możliwość wyrównania do lewej, do prawej i wyśrodkowania: Flow. Layout. LEFT, Flow. Layout. RIGHT, Flow. Layout. CENTER Flow. Layout(int alignment, int h. Gap, int v. Gap) Ø Oprócz możliwości wyrównania jest możliwość ustawienia poziomych i pionowych odstępów pomiędzy komponentami (w pikselach) AWT i Swing - Jacek Rudzński

Border. Layout użyty bez żadnych dodatkowych instrukcji powoduje, że wszystko będzie umieszczone na środku

Border. Layout użyty bez żadnych dodatkowych instrukcji powoduje, że wszystko będzie umieszczone na środku obszaru i rozciągnięte w każdym kierunku aż do krawędzi. Border. Layout potrafi jednak więcej. Ten menadżer układu kieruje się pojęciem 4 rejonów brzegowych oraz domyślnego obszaru środkowego (North, South, East, West, Center). Gdy chcemy je zastosować korzystamy z przeciążonej wersji metody add() jak widać poniżej. AWT i Swing - Jacek Rudzński

Grid. Layout pozwala nam utworzyć tabelę komponentów. W trakcie dodawania komponenty są umieszczane od

Grid. Layout pozwala nam utworzyć tabelę komponentów. W trakcie dodawania komponenty są umieszczane od lewej do prawej i od góry na dół. W konstruktorze możemy podać potrzebną liczbę wierszy i kolumn. W naszym przypadku podajemy w konstruktorze, że będą 3 wiersze i 4 kolumny. AWT i Swing - Jacek Rudzński

Inne konstruktory Border. Layout i Grid. Layout Border. Layout(int h. Gap, int v. Gap)

Inne konstruktory Border. Layout i Grid. Layout Border. Layout(int h. Gap, int v. Gap) Ø możliwość ustawienia poziomych i pionowych odstępów pomiędzy komponentami (w pikselach) Grid. Layout() Ø tworzy pojedynczy rząd z jedną kolumną zaalokowaną dla pojedynczego komponentu Grid. Layout(int rows, int columns, int h. Gap, int v. Gap) Ø oprócz podania liczby wierszy i kolumn mamy możliwość ustawienia poziomych i pionowych odstępów pomiędzy komponentami AWT i Swing - Jacek Rudzński

Card. Layout – cz. 1 Jednym z ciekawszych layout managerów jest Card. Layout. Dzięki

Card. Layout – cz. 1 Jednym z ciekawszych layout managerów jest Card. Layout. Dzięki niemu można stworzyć stos layoutów i poruszać się pomiędzy nimi. Aby utworzyć layout przy pomocy Card. Layouta na początku należy stworzyć panel – rodzic, który będzie zawierał te layouty. Następnie tworzymy obiekt Card. Layout i ustawiamy go jako menadżer układu panelu. Na końcu ustawiamy każdy element stosu tworząc komponenty i dodając je do panelu. Ponieważ Card. Layout pozwala programiście do wybierania pomiędzy elementami w stosie layoutów, potrzebny jest pewien sposób by wiadomo było jak to robić. Dlatego też Card. Layout posiada pewną ilość publicznych metod, aby wiadomo było który layout ma być widoczny na ekranie. Najbardziej przydatne metody znajdują się w tabelce na następnym slajdzie. AWT i Swing - Jacek Rudzński

Card. Layout – cz. 2 Nazwa metody Co robi? first(Container parent) Wyświetla pierwszy element

Card. Layout – cz. 2 Nazwa metody Co robi? first(Container parent) Wyświetla pierwszy element last(Container parent) Wyświetla ostatni element next(Container parent) Wyświetla następny element previous(Container parent) Wyświetla poprzedni element show(Container parent, String name) Wyświetla konkretny element AWT i Swing - Jacek Rudzński

Card. Layout – cz. 3 AWT i Swing - Jacek Rudzński

Card. Layout – cz. 3 AWT i Swing - Jacek Rudzński

Grid. Bag. Layout – cz. 1 Największe możliwości spośród wszystkich menadżerów układu daje nam

Grid. Bag. Layout – cz. 1 Największe możliwości spośród wszystkich menadżerów układu daje nam jednak Grid. Bag. Layout – przy jego pomocy możemy stworzyć bardziej skomplikowanie (wymagające więcej kodu) rozmieszczenia komponentów. Przy pomocy wielu narzędzi automatycznego generowania GUI jak n. p. JBuilder łatwiej go stosować, ale czy od razu zrozumieć? Przykładowo JBuilder potrafiłby zmodyfikować metodę add() na coś w tym stylu: add(p. Aps, new Grid. Bag. Constraints 2(1, Grid. Bag. Constraints. RELATIVE, 3, 0. 0, Grid. Bag. Constraints. CENTER, Grid. Bag. Constraints. NONE, new Insets(0, 0, 0, 0), -3, 45)); Jednak gdy ręcznie tworzymy kod, nie musi on tak strasznie wyglądać. AWT i Swing - Jacek Rudzński

Grid. Bag. Layout – cz. 2 Zaletą Grid. Bag. Layout jest to, iż dzieli

Grid. Bag. Layout – cz. 2 Zaletą Grid. Bag. Layout jest to, iż dzieli okienka na gridy, dzięki czemu możemy tworzyć różnej wielkości komponenty. Każdy kompnent jest związany z instancją Grid. Bag. Constraints specyfikuje: ü jak komponent jest ustawiony ü w której komórce się zaczyna i kończy dany komponent ü jak komponent się zmieni, gdy będzie dodatkowe miejsce ü w którą stronę będzie wyrównany komponent Na następnym slajdzie znajduje się tabelka określająca co oznaczają poszczególne pola klasy Grid. Bag. Constraints. AWT i Swing - Jacek Rudzński

Grid. Bag. Layout – cz. 3 Pole Opis anchor Określa gdzie wewnątrz obszaru danego

Grid. Bag. Layout – cz. 3 Pole Opis anchor Określa gdzie wewnątrz obszaru danego komponentu powinien on być umieszczony np. Grid. Bag. Constraints. NORTH, Grid. Bag. Constraints. NORTHEAST, Grid. Bag. Constraints. SOUTHEAST, Grid. Bag. Constraints. SOUTHWEST, Grid. Bag. Constraints. NORTHWEST, Grid. Bag. Constraints. CENTER. fill Określa jaki rozmiar nadać komponentowi, gdy obszar wyświetlania jest większy niż komponent np. : Grid. Bag. Constraints. NONE (HORIZONTAL, VERTICAL czy BOTH) gridheight Ilość komórek w każdej kolumnie obszaru wyświetlania danego komponentu. gridwidth Ilość komórek w każdym wierszu obszaru wyświetlania danego komponentu. gridx Współrzędna x komórki w górnym lewym rogu obszaru wyświetlania danego komponentu. gridy Współrzędna y komórki w górnym lewym rogu obszaru wyświetlania danego komponentu. insets Minimalna ilość miejsca pomiędzy komponentem a brzegami obszaru wyświetlania. ipadx Ilość miejsca w poziomie wokół komponentu. ipady Ilość miejsca w pionie wokół komponentu. weightx Określa czy komponenty się powiększają poziomo aby zapełnić obszar wyświetlania. weighty Określa czy komponenty się powiększają pionowo aby zapełnić obszar wyświetlania. AWT i Swing - Jacek Rudzński

Grid. Bag. Layout – cz. 4 Przykład AWT i Swing - Jacek Rudzński

Grid. Bag. Layout – cz. 4 Przykład AWT i Swing - Jacek Rudzński

Grid. Bag. Layout – cz. 5 Przykład – ciąg dalszy AWT i Swing -

Grid. Bag. Layout – cz. 5 Przykład – ciąg dalszy AWT i Swing - Jacek Rudzński

Box. Layout Jako, że Grid. Bag. Layout jest całkiem skomplikowany, w Swingu istnieje Box.

Box. Layout Jako, że Grid. Bag. Layout jest całkiem skomplikowany, w Swingu istnieje Box. Layout, posiadający wiele zalet poprzedniego, ale mniej skomplikowany. Box. Layout pozwala na kontrolę rozmieszczenia komponentów w pionie i poziomie oraz na kontrolę odstępów pomiędzy komponentami. AWT i Swing - Jacek Rudzński

Brak Layout Managera – ręczna robota Jeśli layout jest ustawiony na null, to należy

Brak Layout Managera – ręczna robota Jeśli layout jest ustawiony na null, to należy ręcznie ustawić i nadać rozmiar komponentom. Korzystamy z przydatnej metody set. Bounds: ü component. set. Bounds(left, top, width, height) AWT i Swing - Jacek Rudzński

Rysowanie w AWT Do rysowania w Javie korzystamy z metody: public void paint(Graphics g)

Rysowanie w AWT Do rysowania w Javie korzystamy z metody: public void paint(Graphics g) Wywołuje się ona za każdym razem, gdy kiedy applet bądź aplikacja się uruchamia oraz gdy musi być ponownie wyświetlany. Gdy po wykonaniu jakiejś czynności znowu rysować korzystamy z metody: public void repaint() lub jedną z jej przeciążonych wersji: public void repaint(long tm) public void repaint(int x, int y, int width, int height) public void repaint(long tm, int x, int y, int width, int height AWT i Swing - Jacek Rudzński

Rysowanie w Swing natomiast dzieli standardową metodę paint() na trzy osobne metody, które są

Rysowanie w Swing natomiast dzieli standardową metodę paint() na trzy osobne metody, które są wywoływane w następującej kolejności: protected void paint. Component(Graphics g) protected void paint. Border(Graphics g) protected void paint. Children(Graphics g) Programy Swingowe winny przesłaniać metodę paint. Component() zamiast paint(). Wprawdzie API zezwala na takie rozwiązanie, nie ma potrzeby przesłaniania paint. Border() czy paint. Children() (jeśli jednak to czynimy, należy to robić z ostrożnością). AWT i Swing - Jacek Rudzński

Podwójne buforowanie w AWT Podwójne buforowanie jest techniką gładkich animacji na płótnach (Canvas) czy

Podwójne buforowanie w AWT Podwójne buforowanie jest techniką gładkich animacji na płótnach (Canvas) czy panelach. Jest to technika pamięciochłonna ale niezbędna, gdy w naszym applecie chcemy otrzymać animacji przy wielokrotnym stosowaniu metody repaint(). W AWT przerysowywanie jest obsługiwane przy pomocy metody update(). Ta metoda po prostu czyści cały obszar obiektu i następnie wywołuje metodę paint(). Oto prosty przykład zastosowania podwójnego buforowania na płótnie. Polega on na tym, iż najpierw tworzony jest pozaekranowy bufor i po przerysowaniu jest dopiero przerzucany do okna. AWT i Swing - Jacek Rudzński

Podwójne buforowanie w Swing Podwójne buforowanie jest oczywiście także obecne w Swingu. Co więcej

Podwójne buforowanie w Swing Podwójne buforowanie jest oczywiście także obecne w Swingu. Co więcej w Swingu mamy o wiele większe możliwości niż w AWT. Swing tworzy wsparcie dla podwójnego buforowania. Robi to przy pomocy następującej metody z javax. swing. JComponent: public boolean is. Double. Buffered() public void set. Double. Buffered(boolean o) Domyślnie zwracana jest wartość true dla wszystkich komponentów Swinga. AWT i Swing - Jacek Rudzński

Model zdarzeń w Javie – cz. 1 Kiedy użytkownik klika na przycisk, wpisuje tekst,

Model zdarzeń w Javie – cz. 1 Kiedy użytkownik klika na przycisk, wpisuje tekst, używa myszy lub wykonuje jakąś inną czynność związaną z interfejsem w danym applecie, wtedy ma miejsce zdarzenie. W Javie 1. 0 do obsługi kliknięć stosowano metodę action() (w tym momencie uznaną za przestarzałą), natomiast od czasu Javy 1. 1 korzystamy z modelu zdarzeń delegowanych. Aby zastosować tę technikę musimy zaimplementować jeden z interfejsów typu Listener. Do wyboru mamy wiele interfejsów w zależności od tego co potrzebujemy w danym applecie bądź aplikacji. Klasa która implementuje interfejs typu XXXListener nie musi wcale być główną klasą, lecz można stworzyć do tego celu zupełnie nową klasę. Dla każdego interfejsu typu XXXListener istnieją metody add. XXXListener() oraz remove. XXXListener() , dzięki którym można dodawać i usuwać odbiorców zdarzeń. AWT i Swing - Jacek Rudzński

Model zdarzeń w Javie – cz. 2 Zdarzenie Interfejs odbiorcy Komponenty generujące dany typ

Model zdarzeń w Javie – cz. 2 Zdarzenie Interfejs odbiorcy Komponenty generujące dany typ zdarzenia na przykładzie komponentów Swinga Action. Event Action. Listener JButton, JList, JText. Field, JMenu. Item oraz dziedziczące po nim m. in. JCheck. Box. Menu Adjustment. Event Adjustment. Listener JScrollbar oraz wszystko co implementuje interfejs Adjustable Component. Event Component. Listener Component oraz dziedziczące po nim m. in. : JButton, JCanvas, JCheck. Box, JCombo. Box, Container, JPanel, JApplet, JScroll. Pane, Window, JDialog, JFile. Dialog, JFrame, JLabel, JList, JScrollbar, JText. Area i JText. Field Container. Event Container. Listener Container oraz dziedziczące po nim m. in. : JPanel, JApplet, JScroll. Pane, Window, JDialog, JFile. Dialog i JFrame Focus. Event Focus. Listener Component oraz dziedziczące po nim Key. Event Key. Listener Component oraz dziedziczące po nim Mouse. Event Mouse. Motion. Listener Component oraz dziedziczące po nim Window. Event Window. Listener Window oraz dziedziczące po nim: JDialog, JFile. Dialog, JFrame Item. Event Item. Listener JCheck. Box, JCheck. Box. Menu, JList, JCombo. Box Text. Event Text. Listener JText. Area i JText. Field AWT i Swing - Jacek Rudzński

Model zdarzeń w Javie - cz. 3 Interfejs odbiorcy Metody interfejsu Action. Listener action.

Model zdarzeń w Javie - cz. 3 Interfejs odbiorcy Metody interfejsu Action. Listener action. Performed(Action. Event) Adjustment. Listener adjustment. Value. Changed(Adjustment. Event) Component. Listener component. Hidden(Component. Event), component. Shown(Component. Event), component. Moved(Component. Event), component. Resized(Component. Event) Container. Listener component. Added(Container. Event), component. Removed(Container. Event) Focus. Listener focus. Gained(Focus. Event), focus. Lost(Focus. Event) Key. Listener key. Pressed(Key. Event), key. Released(Key. Event), key. Typed(Key. Event) Mouse. Listener mouse. Clicked(Mouse. Event), mouse. Entered(Mouse. Event), mouse. Exited(Mouse. Event), mouse. Pressed(Mouse. Event), mouse. Released(Mouse. Event) Mouse. Motion. Listener mouse. Dragged(Mouse. Event), mouse. Moved(Mouse. Event) Item. Listener item. State. Changed(Item. Event) Window. Listener window. Opened(Window. Event), window. Actiavted(Window. Event), window. Deactivated(Window. Event) AWT i Swing - Jacek Rudzński

Model zdarzeń w Javie - cz. 4 Niektóre interfejsy odbiorców, posiadają (jak widać na

Model zdarzeń w Javie - cz. 4 Niektóre interfejsy odbiorców, posiadają (jak widać na tabelce w poprzednim slajdzie) wiele metod. Często zdarza się, że potrzebujemy jedną metodę np. mouse. Click() z Mouse. Listener-a. Niestety musimy wtedy zaimplementować także pozostałe metody z tego Listnera choć nic nie robią. Interfejs odbiorcy Adapter Action. Listener brak Adjustment. Listener brak Component. Listener Component. Adapter Container. Listener Container. Adapter Focus. Listener Focus. Adapter Key. Listener Key. Adapter Mouse. Listener Mouse. Adapter Mouse. Motion. Listener Mouse. Motion. Adapter Window. Listener Window. Adapter Aby rozwiązać ten problem, stworzono adaptery dla interfejsów mających więcej niż jedną metodę. Wystarczy wtedy odziedziczyć po adapterze i przesłonić jedynie te metody, które mają zostać zmienione. AWT i Swing - Jacek Rudzński

Zasada jednego wątku w Swingu – cz. 1 „Gdy komponent Swinga zostanie zrealizowany, cały

Zasada jednego wątku w Swingu – cz. 1 „Gdy komponent Swinga zostanie zrealizowany, cały kod może mieć wpływ lub może zależeć od stanu jaki dany komponent powinien wykonać w wątku obsługującym zdarzenie (z ang. event-dispatching thread)” Po pierwsze należy zdefiniować co oznaczają dwa terminy: zrealizowany oraz wątek obsługujący zdarzenie. Zrealizowany oznacza, że metoda paint() mogła być lub może być wywołana dla danego komponentu. Komponent Swinga, który jest głównym oknem może natomiast zrealizowany także przez metody takie jak set. Visible(true), czy show(). Gdy okno zostanie zrealizowane, wszystkie komponenty wewnątrz także zostaną zrealizowane. Innym sposobem na zrealizowanie komponentu jest dodanie go do pojemnika (Container), który już został zrealizowany. Wątkiem obsługującym zdarzenie jest ten wątek, który wykonuje rysowanie oraz obsługę zdarzeń. Na przykład metody paint() czy action. Performed() są automatycznie wykonywane w tym wątku. AWT i Swing - Jacek Rudzński

Zasada jednego wątku w Swingu – cz. 2 Są jednak wyjątki od powyższej reguły

Zasada jednego wątku w Swingu – cz. 2 Są jednak wyjątki od powyższej reguły n. p. : Kilka metod jest „thread – safe”. W API do Swinga, takie metody są oznaczone takim oto tekstem: „This method is thread safe, although most Swing methods are not. Please see"Using a Swing Worker Thread" for more information. „ Co jest „thread – safe”? ü metoda repaint() ü tworzenie GUI w metodzie init() jako, że przeglądarki nie rysują appletu zanim będzie wywołany init() ü tworzenie GUI w main() przez co zostanie zrealizowany w wątku głównym AWT i Swing - Jacek Rudzński

Komponenty Swinga Więcej o komponentach Swinga można przeczytać można m. in. na stronie: http:

Komponenty Swinga Więcej o komponentach Swinga można przeczytać można m. in. na stronie: http: //java. sun. com/docs/books/tutorial/uiswing/components/component. html AWT i Swing - Jacek Rudzński

Bibliografia ü Eckel Bruce – „Thinking in Java. Edycja Polska. Wydanie 3” ü Holzner

Bibliografia ü Eckel Bruce – „Thinking in Java. Edycja Polska. Wydanie 3” ü Holzner Steven – „Java 1. 2” ü www. corewebprogramming. com ü java. sun. com ü inne źródła internetowe ü program Eclipse ü własna wyobraźnia AWT i Swing - Jacek Rudzński