Java dostarcza dwa pakiety klas pomocnych w tworzeniu GUI
Transkrypt
Java dostarcza dwa pakiety klas pomocnych w tworzeniu GUI
Java dostarcza dwa pakiety klas pomocnych w tworzeniu GUI (Graphics User Interface): • java.awt - Abstract Windowing Toolkit – starszy, zawiera m.in. klasy: Frame, Panel, Button • javax.swing – nowszy, zawiera m. in. komponenty: JFrame, JPanel, JButton. Ogólnie: swing zawiera więcej komponentów niż AWT, a komponenty znane wcześniej z AWT mają tu rozbudowane właściwości Budując aplikację okienkową wykorzystamy klasę JFrame jako klasę bazową dla naszej aplikacji. Dostarcza ona standardowego wyposażenia okienka, z obramowaniem i paskiem systemowym. Uruchom Eclipse i wybierz Workspace. Utwórz nowy projekt File->New->Java Project name Proj2 Utwórz w nim nową klasę File->New->Class name Okno , zaznacz √ public static void main() Dopisz informację o dziedziczeniu z klasy JFrame: public class Okno extends JFrame i zaimportuj klasę javax.swing.JFrame W metodzie main() wywołasz konstruktor, który utworzy nowy obiekt klasy Okno public static void main(String[] args) { new Okno(); } ale musisz w klasie Okno zdefiniować kreator obiektu klasy Okno: Okno() { this.setTitle("Java jest OK"); this.setSize(340,300); //szerokość, wysokość okna this.setLocation(200,200); // połoŜenie okna this.setDefaultCloseOperation(EXIT_ON_CLOSE); słowo this. można tu opuścić, ale ułatwia ono wprowadzanie metod – nazwę metody można wybrać z okienka podpowiedzi, które rozwija się po wprowadzeniu znaku kropki setVisible(true); } Zapisz kod i uruchom swoją pierwszą aplikację okienkową. Zmiana koloru tła okienka: W klasie Okno zadeklaruj zmienną wnetrze klasy Container i zaimportuj klasę java.awt.Container; W kreatorze klasy Okno przypisz zmiennej wnetrze wybrany kolor. Trzeba zaimportować klasę Color import java.awt.Color; import java.awt.Container; import javax.swing.JFrame; kolor niebieski dotyczy instrukcji ustawień koloru tła okienka public class Okno extends JFrame { Container wnetrze; public static void main(String[] args) { new Okno(); } Okno() { setTitle("Java jest OK"); setSize(300,300); setLocation(200,200); setDefaultCloseOperation(EXIT_ON_CLOSE); wnetrze = this.getContentPane(); // wnetrze.setBackground(Color.RED); // duŜe litery od wersji java 1.4 wnetrze.setBackground(new Color(255,200,100)); // Color(red,green,blue) setVisible(true); } } Dodawanie komponentów do okienka W klasie Okno zadeklaruj: • dwie zmienne: d i fotka klasy JLabel i zaimportuj klasę javax.swing.JLabel • dwie zmienne: b1 i b2 klasy JButton i zaimportuj klasę javax.swing.JButton W kreatorze klasy Okno przed instrukcją setVisible(true) • utwórz nowe obiekty wywołując kreatory odpowienich klas, • przypisz tym obiektom żądane właściwości • dodaj gotowe obiekty do okienka Klasa JFrame rozmieszcza elementy wewnętrzne według zarządcy LayoutManager zdefiniowanego w niej domyślnie, lub wybranego : centralnie, lub w wierszu, lub w tablicy … Można zarządcę wyłączyć i wówczas każdemu komponentowi trzeba samodzielnie przypisać rozmiary i lokalizację. Jeśli życzysz sobie wybrać czcionkę (krój, wielkość) dla napisów w JLabel i JButton, to musisz tę czcionkę zdefiniować wcześniej, zanim utworzysz w/w komponenty, aby móc ją przypisać właściwościom komponentów (i oczywiście zaimportować klasę java.awt.Font) Komponent klasy JLabel może służyć do wyświetlania tekstu lub grafiki. import import import import import import import import import java.awt.Color; java.awt.Container; java.awt.Font; javax.swing.BorderFactory; javax.swing.ImageIcon; java.util.Random; javax.swing.JButton; javax.swing.JLabel; javax.swing.JFrame; public class Okno extends JFrame { Container wnetrze; JLabel d, fotka; JButton b1, b2; Random r = new Random(); public static void main(String[] args) { new Okno(); } Okno() { setTitle("Java jest OK"); setSize(300,300); setLocation(200,200); setDefaultCloseOperation(EXIT_ON_CLOSE); Obrazki o nazwach plików: d0.jpg, d1.jpg, d1.jpg … d9.jpg mam przygotowane w folderze d umieszczonym jako podfolder w bieżącym projekcie wnetrze = this.getContentPane(); wnetrze.setBackground(new Color(255,200,100)); this.setLayout(null); // wyłączam automatycznego zarządcę rozmieszczenia komponentów Font f=new Font("Arial",1,20); d = new JLabel("Dziewczyna"); d.setBounds(20, 50, 150, 20); d.setFont(f); this.add(d); // tworzę czcionkę Font(name,style,size) // // // // tworzę obiekt d i inicjuję treść napisu lokalizacja: setBounds(x,y,szer,wys) przypisuję czcionkę f obiektowi d dodaję obiekt d do okienka fotka = new JLabel(); fotka.setBounds(20,100,120,140); // 120 x 140 to są wymiary obrazka fotka.setBorder(BorderFactory.createEtchedBorder()); // obramowanie fotki fotka.setIcon(new ImageIcon("d/d9.jpg")); // ścieŜka dostępu do pliku graficznego this.add(fotka); // gdzie bieŜący folder to folder projektu b1 = new JButton("Koloruj"); b1.setBounds(170,130,150,20); // za chwilę dodam tu obsługę zdarzenia: b1.addActionListener(this); this.add(b1); b2 = new JButton("Zmień dziewczynę"); b2.setBounds(170,180,100,20); // za chwilę dodam tu obsługę zdarzenia: b2.addActionListener(this); this.add(b2); setVisible(true); } } Obsługa zdarzenia Click przycisków b1 I b2 • Klasa Okno, która ma reagować na zdarzenie Click, musi implementować interfejs nasłuchu akcji: ActionListener. Trzeba zaimportować pakiet java.awt.event.ActionListener; public class Okno extends JFrame implements ActionListener { • Do źródeł zdarzeń (czyli do przycisków b1 i b2) trzeba dołączyć metodę addActionListener przed dodaniem ich do okna b1.addActionListener(this); this.add(b1); // i tak samo dla b2 • Wewnątrz klasy Okno trzeba zdefiniować metodę obsługi zdarzenia: actionPerformed. Nadpisujemy tę metodę, zdefiniowaną pierwotnie (z pustym ciałem) w interfejsie ActionListener. W metodzie actionPerformed rozpoznamy źródło zdarzenia: b1 czy b2. Dla każdego źródła zdarzenia zdefiniujemy odpowiednie bloki poleceń: public void actionPerformed(ActionEvent arg) { if (arg.getSource()==b1) { JOptionPane.showMessageDialog(this,"Przydzielę Ci dziewczynę"); String [] A = {"ANNA","MONIKA","IZA","KASIA","EWA","OLA","JOLA","SANDRA","MAGDA","GAGA"}; int n=A.length; // zlicza ilość imion w tablicy A int numer = r.nextInt(n); // losuje indeks imienia z tablicy A d.setText(A[numer]); // wyświetla imię w JLabel d fotka.setIcon(new ImageIcon(”d/d"+numer+".jpg")); // wyświetla obrazek } if (arg.getSource()==b2) wnetrze.setBackground(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256))); } Metodę actionPerformed można wpisać ręcznie, lub wstwić jej nagłówek przy pomocy okienka Outline: prawo-klik na nazwie klasy Okno -> Source -> Override/Implement Methods -> OK. Jak wprowadzać dane liczbowe do aplikacji okienkowej: Podajmy wiek dziewczyny, niech program odczyta tę liczbę i wyświetli od ilu lat dziewczyna jest już dorosła. Do wprowadzania danych z klawiatury posłuży komponent klasy JTextField, nazwijmy go swiek. Będzie przechowywał liczbę w postaci łańcucha znaków, typu String. Trzeba będzie konwertować ten string na liczbę całkowitą metodą Integer.parseInt(String). Wartość z pola tekstowego JTextField odczytuje się metodą getText(), a umieszczenie nowej wartości w polu JTextField, podobnie jak w etykietce JLabel, metodą setText(String). Dodamy do okienka dwa obiekty klasy JLabel i jeden obiekt klasy JTextField. JLabel lwiek, lstan; JTextField swiek; lwiek = new JLabel("wiek"); lwiek.setBounds(180,140,150,20); add(lwiek); lstan = new JLabel(); lstan.setBounds(180,170,150,20); add(lstan); swiek = new JTextField(10); swiek.setBounds(240,140,80,20); swiek.addKeyListener(this); add(swiek); Pole tekstowe swiek powinno zareagować na naciśnięcie klawisza ENTER: program ma wówczas odczytać daną i wyświetlić wynik w etykietce lstan. Aby obsłużyć zdarzenia związane z klawiaturą, nasza klasa Okno musi implementować interfejs KeyListener i wszystkie trzy jego metody: keyPressed(), keyReleased() i keyTyped(). Ponadto do pola tekstowego swiek trzeba dołączyć nasłuchiwanie zdarzeń klawiatury: addKeyListener() public class Okno extends JFrame implements ActionListener, KeyListener { ... } Z metod interfejsu KeyListener wystarczy nadpisać metodę keyPressed() @Override public void keyPressed(KeyEvent arg0) { if (arg0.getKeyCode()==10) { int w = Integer.parseInt(twiek.getText())-18; if (w<0) lstan.setText("małoletnia"); else lstan.setText("dorosła od lat " + w); } } Pozostałe dwie metody interfejsu KeyListener można pozostawić puste.