Tworzenie elementów graficznych Elementy graficzne w Javie pozwalające tworzyć Graficzny Interfejs Użytkownika (GUI) możemy podzielić na dwie grupy: AWT (Abstract Window Toolkit) bibliotek klas służąca do prostego programowania interfejsu użytkownika SWING część zestawu narzędzi JFC (Java Fundation Class) służące do tworzenia graficznego interfejsu użytkownika
SWING zasada działania Elementy interfejsu użytkownika tworzone są na powierzchni pustych okien (tzw. ramek - frame). Tworzenie polega na rysowaniu przez klasy SWING'a poszczególnych elementów interfejsu. Rozwiązanie takie chociaż wolniejsze od AWT posiada bogatszy zestaw elementów interfejsu oraz charakteryzuje się znacznie mniejszą zależnością od platformy.
Podstawą są ramki klasa JFrame Podstawowym elementem tworzącym interfejs użytkownika jest ramka. Ramkę tworzymy przez stworzenie obiektu klasy JFrame (SWING) lub Frame (AWT). W dalszej części ćwiczeń będziemy korzystać ze SWING'a. Object Component Container JComponent JPanel Window Frame JFrame
Tworzenie prostej ramki class MojaRamka extends JFrame{ public MojaRamka() { setsize(300,200); public static void main(string[] args){ MojaRamka ramka = new MojaRamka(); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true);
Manipulowanie ramką 1 Wybrane metody dziedziczone po Frame: SetIconImage) - pobiera objekt typu Image i uzywa go jako ikonkę ramki. settitle zmienia tekst na pasku tytułowym okna. Argumentem jest String. setresizeable określa czy użytkownik może zmienić rozmiar okna. Pobiera wartość boolean
Manipulowanie ramką 2 Wybrane metody dziedziczone po Component : setlocation(x, y) określa położenie lewego górnego rogu okna, setsize(szer, wys) określa rozmiar okna, setbounds(x, y, szer, wys) określa obydwa powyższe parametry na raz.
Wybrane metody klasy Component Uwaga: poniższe metody dotyczą wszystkich klas dziedziczących po klasie Component. getlocation zwraca położenie lewego górnego narożnika danego komponentu, względem otaczajacego go pojemnika. getlocationonscreen jw. Tylko względem ekranu, getsize pobiera aktualny rozmiar komponentu, setvisible określa czy dany element (w tym ramka) jest widoczny. setenable włącza/wyłącza komponent isshowing zwraca wartość boolean mówiącą o tym czy dany element jest widoczny na ekranie iseabling zwraca czy dany element jest aktywny.
Wybrane metody klasy Window (java.awt.window) tofront przesuwa okno na pierwszy plan, toback przesuwa okno na ostatni plan.
Klasa Toolkit określanie rozmiaru ekranu (java.awt.toolkit) Korzystamy z zestawu narzędzi dostępnych w kalsie Toolkit, jedną z metod dostępych w zestawie narzędzi jest getscreensize. Metoda ta zwraca obiekt klasy dimension, który przechowuje rozmiary ekranu w zmiennych width i height. T o o lk it to o l = T o o lk it.g e td e fa u ltt o o lk it(); D im e n s io n s c re e n D im e n s io n = to o l.g e ts c re e n S iz e (); s e ts iz e (s c re e n D im e n s io n.w id th /2, s c re e n D im e n s io n.h e ig h t/2 ); s e tl o c a tio n (s c re e n D im e n s io n.w id th /4, s c re e n D im e n s io n.h e ig h t/4 );
JFrame struktura wewnętrzna JFrame Obiekty klasy JFrame mają dosyć złożoną strukturę. Możemy w prawdzie rysować w objecie ramki, ale nie jest to praktyka zalecana, w rzeczywistości ramki są pojemnikami na inne komponenty. JRoot JLayeredPane Pow. zawartości Tytuł okna Powierzchnia szklana
Klasa JPanel Elementem którym będziemy się zajmować obecnie będzie powierzchnia zawartości. Będziemy dodawać do niej pojedynczy panel na którym będziemy mogli rysować, pisać i dodawać inne elementy. Panele są obiektami klasy JPanel.
Dodawanie komponentu do pow. zawartości. Aby dodać komponent do powierzchni zawartości używamy następującego kodu: Container pojemnik = getcontentpane(); Component k =...(tutaj określamy komponent); pojemnik.add(k); *) Komponentem może być Panel (JPanel), Przycisk(JButton), itp.
import java.awt.*; import javax.swing.*; Przykład tworzenia i dodawania panelu public class dodajemypanel { public static void main(string[] args) { RamkaZPanelem ramka = new RamkaZPanelem(); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); class RamkaZPanelem extends JFrame { public RamkaZPanelem(){ settitle("ramka z Panelem"); setsize(toolkit.getdefaulttoolkit().getscreensize().width,toolkit.getdefaulttoolkit().getscreensize().height); PanelZTekstem panel = new PanelZTekstem(); Container pojemnik = getcontentpane(); pojemnik.add(panel); class PanelZTekstem extends JPanel { public void paintcomponent(graphics g) { super.paintcomponent(g); g.drawstring("to jest nasz pierwszy tekst w panelu", 100,100);
Zmiana kroju pisma, wielkości znaków oraz koloru wyświetlanego tekstu. Zmiana domyslnego kroju czcionki realizowana jest przez metodę setfont(font); metoda ta przyjmuje jako argumenty obiekty klasy Font (java.awt.font)... Font czcionka = new Font("Havletica",Font.BOLD Font.ITALIC,25); setfont(czcionka);... Zmianę koloru wyświetlanego tekstu uzyskujemy za pomocą metody: setcolor(color). Argumenty to obiekty klasy Color (java.awt.color);
Kod przykładu w całości import java.awt.*; import javax.swing.*; public class RamkaPanelTekst { public RamkaPanelTekst() { public static void main(string[] args) { MojaRamka ramka = new MojaRamka(); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); ramka.settitle("moja ramka z tekstem"); class MojaRamka extends JFrame { public MojaRamka(){ Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); setsize(screensize.width/2,screensize.height/2); setlocation(screensize.width/4,screensize.height/4); MojPanel panel = new MojPanel(); Container pojemnik = getcontentpane(); pojemnik.add(panel); class MojPanel extends JPanel { public void paintcomponent(graphics g){ super.paintcomponent(g); Font czcionka = new Font("Havletica",Font.BOLD Font.ITALIC,25); g.setfont(czcionka); g.setcolor(color.red); g.drawstring("ala ma kota", getwidth()/2,getheight()/2);
Obsługa zdarzeń Obsługę zdarzeń w Java realizujemy za pomocą tzw. Obiektów słuchaczy. Słuchacz jest instancją klasy, która interpretuje specjalny interfejs nazywany interfejsem słuchacza Obiekty będące źródłem zdarzeń (np. Przyciski) potrafią rejestrować obiekty słuchaczy i wysyłać im obiekty reprezentujące zdarzenia Źródła zdarzeń są tak skonstruowane, że wysyłają obiekty zdarzeń do wszystkich zarejestrowanych słuchaczy Obiekty słuchaczy wykorzystują informacje zawarte w zdarzeniach do określenia reakcji na dane zdarzenie
Obsługa zdarzeń przyciski etap 1 Tworzymy szkielet programu - definiujemy klasę ramki import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Przyciski { public Przyciski() { public static void main(string[] args) { RamkaNaPrzyciski ramka = new RamkaNaPrzyciski(300,150); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); class RamkaNaPrzyciski extends JFrame { RamkaNaPrzyciski(int szer, int wys){ settitle("obsługa zdarzeń - przyciski"); setsize(szer,wys);
Obsługa zdarzeń przyciski etap 2 Tworzymy własną klasę PanelZPrzyciskami i umieszczmy w nim przyciski class PanelZPrzyciskami extends JPanel { PanelZPrzyciskami(){ JButton PrzyciskZielony = new JButton("Zielono mi!!!"); JButton PrzyciskCzerwony = new JButton("Czerwono mi!!!"); add(przyciskzielony); add(przyciskczerwony); Dodajemy do klasy RamkaNaPrzyciski objekt klasy PanelZPrzyciskami... // dodajemy panel do powierzchni zawartości Container pojemnik = getcontentpane(); PanelZPrzyciskami panel = new PanelZPrzyciskami(); pojemnik.add(panel);...
// tworzymy objekty "słuchaczy" dla przycisków w klasie SluchaczPrzycisku SluchaczZielonego = new SluchaczPrzycisku(Color.GREEN); SluchaczPrzycisku SluchaczCzerwonego = new SluchaczPrzycisku(Color.RED); //Przypisujemy je do przycisków PrzyciskZielony.addActionListener(SluchaczZielonego); PrzyciskCzerwony.addActionListener(SluchaczCzerwonego); Obsługa zdarzeń przyciski etap 3 Tworzymy klasę wewnętrzna klasy JPanel implementującą klasę ActionListener class SluchaczPrzycisku implements ActionListener { SluchaczPrzycisku(Color c){ KolorTla = c; public void actionperformed(actionevent zdarzenie) { setbackground(kolortla); Color KolorTla; Tworzymy obiekty słuchaczy dla przycisków i integrujemy je z przyciakami w klasie reprezentującej panel z przyciskami
Całość kodu import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Przyciski { public Przyciski() { public static void main(string[] args) { RamkaNaPrzyciski ramka = new RamkaNaPrzyciski(300,150); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); class RamkaNaPrzyciski extends JFrame { RamkaNaPrzyciski(int szer, int wys){ settitle("obsługa zdarzeń - przyciski"); setsize(szer,wys); // dodajemy panel do powierzchni zawartości Container pojemnik = getcontentpane(); PanelZPrzyciskami panel = new PanelZPrzyciskami(); pojemnik.add(panel); class PanelZPrzyciskami extends JPanel { PanelZPrzyciskami(){ JButton PrzyciskZielony = new JButton("Zielono mi!!!"); JButton PrzyciskCzerwony = new JButton("Czerwono mi!!!"); add(przyciskzielony); add(przyciskczerwony); // tworzymy objekty "słuchaczy" dla przycisków SluchaczPrzycisku SluchaczZielonego = new SluchaczPrzycisku(Color.GREEN); SluchaczPrzycisku SluchaczCzerwonego = new SluchaczPrzycisku(Color.RED); //Przypisujemy je do przycisków PrzyciskZielony.addActionListener(SluchaczZielonego); PrzyciskCzerwony.addActionListener(SluchaczCzerwonego); class SluchaczPrzycisku implements ActionListener { SluchaczPrzycisku(Color c){ KolorTla = c; public void actionperformed(actionevent zdarzenie) { setbackground(kolortla); Color KolorTla;
Modyfikacja 1.) Proszę dodać do poprzedniego projektu dodatkowy przycisk zmieniający tło na niebieskie. 2.) Wykorzystując metodę System.exit(0) dodać przycisk Wyjście zamykający okienko. (należy utworzyć dodatkową klasę słuchacza do obsługi tego zdarzenia).