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.