10. Tworzenie graficznego łącza z użytkownikiem
10.1. Elementy biblioteki AWT
Graficzne łącze do współpracy z użytkownikiem programu (GUI - Graphical User's Interface) można łatwo zbudować za pomocą zestawu Abstrakcyjnych Narzędzi Okienkowych (AWT - Abstract Windowing Toolkit).
Elementy AWT (pakiet java.awt) tworzą hierarchię klas pokazaną na następnej stronie:
Składnik (Component) może być etykietą (Label), polem tekstowym (TextField), przyciskiem (Button) itp.;
Pojemnik (Container) jest składnikiem AWT, w którym mogą być umieszczane inne składniki;
Panel (Panel) jest pojemnikiem, którego zawartość można wyświetlić na ekranie (aplet jest szczególnym przypadkiem panelu);
Płótno (Canvas) jest miejscem na umieszczanie rysunków (na panelach też można rysować);
Okno (Window) może zawierać ramki, paski przewijania itp.;
Ramka (Frame) jest podstawowym składnikiem niezależnego okna.
Aby składnik AWT pojawił się na ekranie musimy najpierw stworzyć odpowiedni obiekt, a następnie dodać go do aktualnego pojemnika za pomocą metody add ( ). Na przykład, aby na aplecie pojawił się przycisk z napisem „Koniec”, inicjujemy aplet w taki sposób:
public void init ( ) {
Button b = new Button(”Koniec”);
add ( b );
Dodanie składnika AWT nie przesądza o jego pozycji względem pojemnika. Decyduje o tym aktualny układacz elementów (layout manager):
FlowLayout ( )
GridLayout ( )
BorderLayout ( )
CardLayout ( )
GridBagLayout ( )
Wyboru układacza dokonujemy za pomocą instrukcji
setLayout( new <nazwaUkładacza>
( <opcjonalne argumenty> ) );
Domyślnie stosowany jest układacz FlowLayout ( ), który układa składniki według kolejności dodawania centrując je w wierszach. Jako argumenty można podać inne sposoby wyrównania oraz odstępy poziome i pionowe, np.
setLayout ( new FlowLayout ( FlowLayout.LEFT, 30, 10 ) );
Układacz GridLayout pozwala określić wymiary tabeli, w której klatkach będą umieszczane kolejne składniki AWT:
setLayout ( new GridLayout ( 3, 2 ) );
Podając 2 dodatkowe argumenty możemy określić poziome i pionowe odstępy pomiędzy składnikami:
setLayout ( new GridLayout ( 3, 2, 10, 30 ) );
Układacz BorderLayout umieszcza 4 składniki na obrzeżu panelu, rezerwując dla każdego z nich jak najmniej miejsca. Piąty składnik zajmuje cały środkowy obszar panelu. Wybieramy ten rodzaj układacza przez zlecenie
setLayout ( new BorderLayout ( ) );
lub
setLayout ( new BorderLayout ( 10, 30 ) );
gdy chcemy ustalić odstępy. Natomiast w metodzie add ( ) musimy podać położenie każdego z dodawanych składników. Służą do tego napisy ”North”, ”East”, ”South”, ”West”, ”Center”, np.
add ( ”North”, new Button ( ”Jeden” ) );
Poniższy przykład ilustruje stosowanie prostych układaczy elementów.
Przykład
import java.awt.*;
public class Uklady extends java.applet.Applet {
public void init ( ) {
setBackground ( Color.blue );
// domyślny układacz FlowLayout
Panel p1 = new Panel ( );
p1.setBackground ( Color.green );
p1.add ( new Button ( "P11" ) );
p1.add ( new Button ( "P12" ) );
p1.add ( new Button ( "P13" ) );
p1.add ( new Button( "P14" ) );
add ( p1 );
// układacz GridLayout
Panel p2 = new Panel ( );
p2.setBackground ( Color.red );
p2.setLayout ( new GridLayout ( 2, 2, 10, 10) );
p2.add ( new Button ( "P21" ) );
p2.add ( new Button ( "P22" ) );
p2.add ( new Button ( "P23" ) );
p2.add ( new Button ( "P24" ) );
add ( p2 );
// układacz BorderLayout
Panel p3 = new Panel ( );
p3.setBackground ( Color.white );
p3.setLayout ( new BorderLayout ( 10, 10) );
p3.add ( "North", new Button ( "P31" ) );
p3.add ( "East", new Button ( "P32" ) );
p3.add ( "South", new Button ( "P33" ) );
p3.add ( "West", new Button ( "P34" ) );
p3.add ( "Center", new Button ( "P35" ) );
add ( p3 );
}
}
Układacz GridBagLayout ( ) daje największe możliwości, ale jest trudniejszy w użyciu. Elementy układamy za pomocą tego układacza na siatce prostokątnej, lecz w odróżnieniu od układacza GridLayout ( ) mogą one zajmować kilka klatek. Dodatkowo możemy wpływać na proporcje elementów.
Parametry sterujące umieszczeniem kolejnego elementu powinny być przekazane do następujących zmiennych instancyjnych obiektu klasy GridBagConstraints:
gridx, |
współrzędne elementu na siatce (klatka zajmowana przez lewy górny róg) |
gridwidth, |
liczba kolumn i wierszy zajmowanych przez element |
weightx, |
wagi wymiarów elementu |
Kolejność postępowania jest taka:
1) zgłaszamy ukladacz
GridBagLayout gbl = new GridBagLayout ( );
2) tworzymy obiekt pomocniczy
GridBagConstraints gbc = new GridBagConstraints ( );
I przekazujemy mu parametry elementu el.
3) kojarzymy ten obiekt z układaczem i elementem za pomocą metody
gbl.setConstraints ( el, gbc );
Przykład
Utworzymy łącze do komunikacji z użytkownikiem, które będzie zawierało 3 panele:
panel grafiki;
panel komunikatów;
panel przycisków.
Niech panele te mają być rozłożone w następujacy sposób:
h
import java.awt.*;
public class Przycisk1 extends java.applet.Applet {
Panel grafika;
Panel komunikaty;
Panel przyciski;
GridBagLayout gbl;
GridBagConstraints gbc;
static final int D = 10; // margines wewnętrzny
void buildConstraints ( GridBagConstraints gbc,
int gx, int gy, int gw, int gh,
int wx, int wy ) {
gbc.gridx = gx;
gbc.gridy = gy;
gbc.gridwidth = gw;
gbc.gridheight = gh;
gbc.weightx = wx;
gbc.weighty = wy;
}
public Insets getInsets ( ) {
return new Insets ( D, D, D, D );
}
public void init ( ) {
setBackground ( Color.lightGray );
gbl = new GridBagLayout ( );
gbc = new GridBagConstraints ( );
setLayout ( gbl );
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
buildConstraints ( gbc, 0, 0, 1, 1, 80, 80, D, D );
grafika = new Panel ( );
grafika.setBackground ( Color.yellow );
gbl.setConstraints ( grafika, gbc );
add ( grafika );
buildConstraints ( gbc, 0, 1, 2, 1, 100, 20, D, D );
komunikaty = new Panel ( );
komunikaty.setBackground ( Color.green );
gbl.setConstraints ( komunikaty, gbc );
add ( komunikaty );
buildConstraints ( gbc, 1, 0, 1, 1, 20, 80, D, D );
przyciski = new Panel ( );
przyciski.setBackground ( Color.blue );
gbl.setConstraints ( przyciski, gbc );
add ( przyciski );
przyciski.setLayout ( new GridLayout ( 3, 1, D, D ));
przyciski.add ( new Button ( "Open" ));
przyciski.add ( new Button ( "Close" ));
przyciski.add ( new Button ( "Exit" ));
}
}
Adam Borkowski Język programowania „Java” 10−1
Adam Borkowski Język programowania „Java” 10−4
Applet
Textfield
Label
Frame
Panel
Window
Checkbox
Canvas
Button
Container
Component
Label
TextField
Panel
Applet
Label
TextField
Panel
Frame
EXIT
CLOSE
OPEN