Prawo Murphy'ego: Każda formuła i każda stała muszą być traktowane jako zmienne.
Część 5.2. Komponenty
Label  |   TextField  |   TextArea  |   Button  |   Checkbox  |   CheckboxGroup  |   Choice  |   List

 

Komponent jest obiektem posiadającym graficzną reprezentację, która może być wyświetlona na monitorze i może reagować na działania użytkownika. Przykładem komponentu może być przycisk polecenia, pole tekstowe, opcja wyboru. Komponentem jest również obiekt klasy Frame. Spośród innych wyróżnia go jednak to, że może stanowić pojemnik, w którym umieszczane są inne komponenty.

W tej części kursu zapoznasz się z typowymi komponentami używanymi w aplikacjach, ich podstawowymi właściwościami i metodami oraz poznasz sposób obsługi związanych z nimi zdarzeń. Na koniec napiszemy program stanowiący przegląd podstawowych komponentów programu.

Ze względu na obszerność materiału omówimy tylko podstawowe, najczęściej używane właściwości i metody każdego z komponentów. Szczegółowe informacje o każdym z nich możesz uzyskać z dokumentacji języka.

Jednym z dość podstawowych zagadnień przy tworzeniu aplikacji jest rozmieszczenie wszystkich jej komponentów wewnątrz okna. Java dostarcza bardzo wiele metod automatycznego ich rozmieszczania i porządkowania. Omówienie ich wymagałoby całego odrębnego wykładu. Dlatego też my będziemy korzystać z metody wspólnej dla wszystkich komponentów - dostarczonej przez klasę Component - pozwalającą umieścić nowy element w wybranym miejscu okna i nadać mu określone wymiary: z metody setBounds. Metoda setBounds ustala położenie i rozmiar komponentu. Może być wykorzystana zarówno podczas tworzenia komponentu, jak i w czasie pracy aplikacji do zmiany jego lokalizacji w oknie lub wielkości.

Aby uniknąć omawiania jej przy każdym z komponentów tera omówimy je składnie:

	public void setBounds(int x, int y, int szerokość, int wysokość)
					  
Parametry:
	x         - współrzędna X lewego górnego rogu komponentu
	y         - współrzędna Y lewego górnego rogu komponentu
	szerokość - szerokość komponentu
	wysokość  - wysokość komponentu

Label - etykieta

Obiekt etykiety (Label) służy do wyświetlenia jednowierszowego tekstu z możliwością jedynie jego odczytywania. Wyświetlany tekst może być zmieniany przez aplikację, ale nie przez użytkownika.

Konstruktory
Label ( )tworzy pustą etykietę
Label (String tekst)tworzy etykietę z podanym tekstem wyrównanym do lewej strony
Label (String tekst, int wyrównanie) tworzy etykietę z podanym tekstem wyrównanym zgodnie z podanym parametrem:
Label.CENTER - środkowanie tekstu
Label.LEFT - tekst wyrównany do lewej
Label.RIGHT - tekst wyrównany do prawej
Metody
getText ( )pobiera wyświetlany w etykiecie tekst
setAlignment (int wyrównanie)zmienia sposób wyrównania teksu na podany:
Label.CENTER - środkowanie tekstu
Label.LEFT - tekst wyrównany do lewej
Label.RIGHT - tekst wyrównany do prawej
setText (String tekst)zmienia wyświetlany w etykiecie tekst na podany

Przykłady:
	add(new Label ("To jest etykieta"));
	// etykieta z tekstem wyrównanym do środka
	add(new Label ("Inna etykieta", Label.CENTER));

TextField - okienko tekstowe

Okienko tekstowe (TextField) jest komponentem służącym do wprowadzania i edycji jednowierszowego tekstu. Każde wciśnięcie klawisza wewnątrz okienka tekstowego wywołuje jedno lub więcej zdarzeń klasy KeyEvent typu: keyPressed, keyReleased lub keyTyped (zobacz). Obsłużenie zdarzeń związanych z klawiaturą wymaga zaimplementowania przez program klasy KeyListener za pomocą metody addKeyListener.

Konstruktory
TextField ( )tworzy puste okienko tekstowe
TextField (int kolumn)tworzy puste okienko tekstowe z podaną ilością kolumn
TextField (String tekst)tworzy okienko tekstowe z podanym tekstem
TextField (String tekst, int kolumn)tworzy okienko tekstowe z podanym tekstem o podanej ilości kolumn
Metody
addActionListener (ActionListener al)dodaje podaną metodę obsługi zdarzeń związanych z okienkiem tekstowym
setText (String tekst)zmienia wyświetlany w okienku tekst na podany
getText ( )pobiera tekst z okienka

Przykład:
	TextField tf1, tf2, tf3, tf4;
	 // puste okienko tekstowe
	 tf1 = new TextField ( );
	 // puste okienko tekstowe o 20 kolumnach
	 tf2 = new TextField ("", 20);
	 // okienko z podanym tekstem
	 tf3 = new TextField ("Pole tekstowe!");
	 // okienko z podanym tekstem o 30 kolumnach
	 tf4 = new TextField ("Pole tekstowe", 30);

TextArea - pole tekstowe

Pole tekstowe (TextArea) to wielowierszowy obszar do wyświetlania tekstu. Może być wykorzystane tylko do wyświetlenia tekstu lub do jego edycji.

Konstruktory
TextArea ( )tworzy puste pole tekstowe
TextArea (int wierszy, int kolumn)tworzy puste pole tekstowe o podanej ilości wierszy i kolumn
TextArea (String tekst)tworzy pole tekstowe z podanym tekstem
TextArea (String tekst, int wierszy, int kolumn)tworzy pole tekstowe z podanym tekstem, o podanej ilości wierszy i kolumn
TextArea (String tekst, int wierszy, int kolumn, int scrollbars)tworzy pole tekstowe z podanym tekstem, o podanej ilości wierszy i kolumn oraz zdefiniowanymi listwami przewijania.
Parametr scrollbars może przyjąć jedną z wartości:
TextArea.SCROLLBARS_BOTH - pionowa i pozioma listwa przewijania (domyślnie)
TextArea.SCROLLBARS_HORIZONTAL_ONLY - tylko pozioma listwa przewijania
TextArea.SCROLLBARS_VERTICAL_ONLY - tylko pionowa listwa przewijania
TextArea.SCROLLBARS_NONE - bez listwy przewijania
Metody
addTextListener (ActionListener al)dodaje podaną metodę obsługi zdarzeń związanych z polem tekstowym
setEditable (boolean b)ustawia możliwość edycji pola tekstowego (true) lub jej brak (false)
getText ( )pobiera tekst z okienka
setText (String tekst)wstawia tekst do pola tekstowego kasując jego dotychczasową zawartość
append (String tekst)dołącza podany tekst do końca pola tekstowego
insert (String tekst, int pozycja)wstawia podany tekst za podaną pozycją w polu tekstowym
replaceRange (String tekst, int start, int koniec)zastępuje tekst od pozycji start do pozycji koniec podanym
select (int start, int koniec)zaznacza fragment tekstu od znaku start do znaku koniec
selectAll ( )zaznacza cały tekst w okienku tekstowym
setSelectionStart (int start)ustawia początek zaznaczonego tekstu (wartości ujemni i większa od końca są ignorowane)
setSelectionEnd (int koniec)ustawia koniec zaznaczonego tekstu (wartości mniejsze od start są ignorowane)

Przykład:
	new TextArea("1-szy wiersz\n2-gi wiersz", 5, 40, TextArea.SCROLLBARS_NONE);

Button - przycisk polecenia

Klasa tworząca przyciski polecenia (Button) z tekstem. Kliknięcie przycisku powoduje na ogół wykonanie przez aplikację jakiegoś działania. Jest też widoczne jako efekt graficzny. Obsługa zdarzenia kliknięcia przycisku wymaga zaimplementowania klasy ActionListener, której abstrakcyjna metoda ActionEvent jest wywoływana po każdym wciśnięciu i zwolnieniu przycisku myszki na komponencie. Jeżeli program chce śledzić również wciśnięcie przycisku myszki, ale bez jego zwolnienia, to musimy zaimplementować abstrakcyjną metodę processMouseEvent zaklasy MouseListener, o której mówiliśmy przy okazji interakcji z użytkownikiem.

Wciśnięcie i zwolnienie myszy wywołuje instancję klasy ActionListener dla przycisku, którą jest metoda abstrakcyjna actionPerformed. Obsługa zdarzeń musi zostać wcześniej zarejestrowana metodą addActionListener klasy Button. Przykład użycia przycisku pokazany jest w programie na końcu tej części kursu.

Konstruktory
Button ( )tworzy przycisk bez tekstu
Button (String tekst)tworzy przycisk z podanym tekstem
Metody
addActionListener (ActionListener al)dodaje metodę obsługi zdarzeń związanych z przyciskiem
getLabel ( )pobiera tekst wyświetlany na przycisku
setLabel (String tekst)ustawia tekst wyświetlany na przycisku

Przykład:
	new Button("Zamknij okno");

Checkbox - przełącznik opcji

Przełącznik opcji (Checkbox) jest komponentem graficznym, który może przyjmować jeden z dwóch stanów: ustawiony (true) lub wyłączony (false). Klikając na nim przełączamy na przemian oba stany. Do przycisku możemy przypisać etykietę z tekstem. Przełączniki działają niezależnie od siebie. Oznacza to, że jeżeli w oknie mamy wiele przełączników, to stan żadnego z niej nie zależy od stanu pozostałych. Wyjątkiem jest umieszczenie przełączników w konteolce CheckboxGroup, kiedy zaczynają stanowić grupę opcji, z których ustawiona (true) może być tylko jedna.

Konstruktory
Checkbox ( )tworzy przełącznik bez etykiety
Checkbox (String tekst)tworzy przełącznik z etykietą
Checkbox (String tekst, boolean stan)tworzy przełącznik z etykietą i ustawia jego wartość
Checkbox (String tekst, boolean stan, CheckboxGroup grupa)
lub
Checkbox (String tekst, CheckboxGroup grupa, boolean stan)
tworzy przełącznik z etykietą, ustawia jego wartość i umieszcza w podanej grupie opcji
Metody
addItemListener (ItemListener il)dodaje metodę obsługi zdarzeń związanych z przyciskiem
getLabel ( )pobiera tekst etykiet opcji
String setLabel (String tekst)ustawia tekst etykiet opcji
boolean getState ( )odczytuje stan ustawienia przycisku
setState (boolean stan)ustawia stan przycisku

Przykład:
	add(new Checkbox("opcja XX"));
	add(new Checkbox("opcja YY", true));

wyświetli w oknie:

CheckboxGroup - pole wyboru

Klasa pola wyboru (CheckboxGroup) w zasadzie nie stanowi samodzielnej kontrolki. Służy do łączenia przełączników opcji (Checkbox) w grupę, w której można wybrać tylko jedną z opcji. Wybranie nowej opcji automatycznie wyłącza dotychczas wybraną. Oznacza to, że w grupie tylko jedna opcja może być włączona (mieć wartość true).

Konstruktory
CheckboxGroup ( )tworzy nową grupę opcji
Metody
Checkbox getSelectedCheckbox ( )pobiera aktualnie wybraną opcję
setSelectedCheckbox (Checkbox opcja)ustawia podaną opcję jako wybraną

Przykład:
	CheckboxGroup ChkG = new CheckboxGroup();
	add(new Checkbox("opcja nr 1", ChkG, false));	
	add(new Checkbox("opcja nr 2", ChkG, true));	
	add(new Checkbox("opcja nr 3", ChkG, false));	

wyświetli w oknie:

Choice - rozwijane pole listy

Rozwijane pole listy (pole kombi: Choice) to komponent pozwalający wybrać jedna z możliwych opcji wyświetlanych w polu podobnym do okienka tekstowego z możliwością jego rozwinięcia w listę. Aktualnie wybrany element wyświetlany jest w okienku.

W systemie Windows nie ma możliwości ustawienia wysokości pola kombi. Jest ona dobierana automatycznie przez system i zależy tylko od wielkości czcionki użytej w komponencie. W metodzie setBounds musimy wprawdzie podać parametr wysokości, ale jego wartość nie ma on żadnego znaczenia.

Należy pamiętać, że elementy listy numerowane są zawsze od zera, czyli dla listy o 10 elementach poprawnymi indeksami będą liczby od 0 do 9.

Konstruktory
Choice ( )tworzy nowe pole kombi
Metody
addItemListener (ItemListener il)dodaje metodę obsługi zdarzeń związanych z polem kombi
add (String tekst)dodnie nowego elementu do listy
insert(String tekst, int indeks)dodanie nowego elementu do listy na określonej pozycji
remove (int indeks)usunięcie elementu o podanej pozycji z listy
remove (String tekst)usunięcie 1-szego elementu o podanym tekście
removeAll ( )usunięcie wszystkich elementów listy
int getItemCount ( )pobranie ilości elementów na liście
select (int indeks)zaznaczenie elementu listy o podanym indeksie
select (String tekst)zaznaczenie pierwszego elementu listy o podanym tekście
String getItem (int indeks)pobranie tekstu elementu z podanej pozycji listy
int getSelectedIndex ( )pobranie indeksu wybranego elementu
String getSelectedItem ( )pobranie tekstu wybranego elementu

Przykład:
	Choice myCombo = new Choice ( );
	myCombo.add("Opcja nr 1");
	myCombo.add("Opcja nr 2");
	myCombo.add("Opcja nr 3");

List - pole listy

Pole listy (List) to komponent prezentujący przewijaną listę haseł tekstowych, w której - zależnie od ustawień - użytkownik może zaznaczyć tylko jedną lub wiele pozycji. Kliknięcie na pozycji powoduje jej zaznaczeni. Ponowne kliknięcie - "odznacza" pozycję.

W listach z pojedynczym zaznaczaniem tylko jeden element może być zaznaczony. Wybranie innego elementu list automatycznie usuwa dotychczasowe oznaczenie. W listach wielokrotnego wyboru można zaznaczyć wiele elementów klikając na nie kolejno.

Domyślnie lista tworzona jest z czterema widocznymi w okienku elementami. W związku z czym deklaracja:

	lst = new List ( );
jest identyczna z deklaracją:
	lst = new List(4, false);

Reagowanie aplikacji na zdarzenia związane z polem listy wymaga zaimplementowania w programie interfejsu ItemListener lub ActionListener i zarejestrowanie obsługi zdarzeń związanych z polem listy.

Należy pamiętać, że elementy listy numerowane są zawsze od zera, czyli dla listy o 10 elementach poprawnymi indeksami będą liczby od 0 do 9.

Konstruktory
List ( )tworzy nowe pole listy
List (int wierszy)tworzy nowe pole listy o podanej ilości widocznych jednorazowo wierszy
List (int wierszy, boolean trybMulti)tworzy nowe pole listy o podanej ilości widocznych jednorazowo wierszy i ustala tryb oznaczania: pojedynczy, gdy trybMulti = false lub wielokrotny, gdy trybMulti = true
Metody
addActionListener (ActionListener al)dodaje metodę obsługi zdarzeń związanych z polem listy
addItemListener (ItemListener il)dodaje metodę obsługi zdarzeń związanych z polem listy
setMultipleMode (boolean tryb)zmienia tryb jedno- i wielokrotnego wyboru
add (String tekst)dodaje nowy element na końcu listy
add (String item, int indeks)dodaje nowy element na podanej pozycji listy
replaceItem (String teskst, int indeks)zastępuje element o podanym indeksie nowym tekstem
int getItemCount ( )zwraca ilość elementów w liście
int getSelectedIndex ( )pobiera indeks zaznaczonego elementu listy
int[] getSelectedIndexes ( )pobiera indeksy zaznaczonych elementów listy
String getSelectedItem ( )pobiera tekst zaznaczonego elementu listy
String[] getSelectedItems ( )pobiera teksty zaznaczonych elementów listy
remove (int indeks)usuwa z listy element o podanym indeksie
remove (String tekst)usuwa z listy pierwszy element o podanym tekście
removeAll ( )usuwa wszystkie elementy z listy
select (int indeks)zaznacza pozycję o podanym indeksie
deselect (int indeks)"odznacza" pozycję o podanym indeksie

Przykłady:
Lista jednokrotnego wyboru:
	List listaA = new List(5, false);
	listaA.add("1 element listy");
	listaA.add("2 element listy");
	listaA.add("3 element listy");
	listaA.add("4 element listy");
	listaA.add("5 element listy");
	listaA.add("6 element listy");
	listaA.select(2);
wyświetli w oknie:
Lista wielokrotnego wyboru:
	List listaB = new List(5, true);
	listaB.add("1 element listy");
	listaB.add("2 element listy");
	listaB.add("3 element listy");
	listaB.add("4 element listy");
	listaB.add("5 element listy");
	listaB.add("6 element listy");
	listaB.select(0);
	listaB.select(2);
	listaB.select(4);
wyświetli w oknie:

 

 

Na zakończenie tej części kursu program demonstrujący użycie wszystkich omówionych tu komponentów:

import java.awt.*;
import java.awt.event.*;

public class ControlElements extends Frame
                   implements WindowListener, ActionListener, ItemListener
{ // deklaracja zmiennych komponentów
  TextArea  text = new TextArea();
  TextField txt  = new TextField();
  List      lst1 = new List(5, false);
  List      lst2 = new List(5, true);
  Button    cmd  = new Button("Przycisk polecenia");
  Label     lbl  = new Label("Tu wyswietli sie aktualna akcja !");
  Choice    opt  = new Choice();
  Checkbox  chk[];
  Checkbox  chk1, chk2;

  public ControlElements ()
  { super ( );
    addWindowListener(this);
    setSize(640, 480);
    setResizable(false);
    setTitle("Przegląd kontrolek Javy");
    setLayout(null);

    // tworzymy menu aplikacji
    MenuBar menuBar = new MenuBar();
    setMenuBar(menuBar);
    Menu menu = new Menu("Koniec");
    menu.add(new MenuItem("Zamknij"));
    menuBar.add(menu);
    menu.addActionListener(this);

    // tworzymy pole tekstowe
    text.setBounds(10, 50, 300, 200);
    this.add(text);
      
    // tworzymy okienko tekstowe
    txt.setBounds(330, 50, 300, 20);
    txt.addActionListener(this);
    this.add(txt);

    // tworzymy grupę 5 opcji
    CheckboxGroup cbg = new CheckboxGroup();
    chk = new Checkbox[5];
    for (int i=0 ; i<5 ; i++)
    { chk[i] = new Checkbox("opcja nr "+(i+1), cbg, (i==1));
      chk[i].setBounds(330, 90+i*30, 110, 20);
      chk[i].addItemListener(this);
      this.add(chk[i]);
    }

    // tworzymy 2 pola wyboru
    chk1 = new Checkbox("opcja XX", false);
    chk1.setBounds(450, 90, 150, 20);
    chk1.addItemListener(this);
    this.add(chk1);

    chk2 = new Checkbox("opcja YY", true);
    chk2.setBounds(450, 120, 150, 20);
    chk2.addItemListener(this);
    this.add(chk2);

    // tworzymy elementy obu dla 2 pół listy
    for (int i=1 ; i<=20 ; i++)
    { lst1.add(i + " element listy");
      lst2.add(i + " element listy");
    }

    // tworzymy pola listy
    lst1.setBounds(10, 270, 300, 100);
    this.add(lst1);
    lst2.setBounds(330, 270, 300, 100);
    this.add(lst2);

    // tworzymy przycisk polecenia
    cmd.setBounds(10, 390, 300, 40);
    this.add(cmd);
    cmd.addActionListener(this);

    // tworzymy listę elementów i pole kombi
    for (int i=0 ; i<=20 ; i++)
    { opt.add("opcja pola kombo numer "+i);
    }
    opt.setBounds(330, 390, 300, 30);
    opt.addItemListener(this);
    this.add(opt);

    // tworzymy etykietę
    lbl.setBounds(10, 440, 620, 50);
    lbl.setForeground(Color.red);
    lbl.setBackground(Color.green);
    lbl.setFont(new Font("Courier New",Font.BOLD,18));
    this.add(lbl);

    // wyświetlamy okno aplikacji
    setVisible(true);
  }

  // metod obsługi zdarzeń menu i przycisku polecenia
  public void actionPerformed (ActionEvent e)
  { String command = e.getActionCommand();
    lbl.setText(command);
    if (command.equals("Zamknij"))    { System.exit(0); }
  }

  // metod obsługi zdarzeń pola kombi i przełączników opcji
  public void itemStateChanged (ItemEvent e)
  { String command = e.paramString();
    lbl.setText("KONTROLKA: " + 
                    command.substring(command.indexOf("=") + 1,
                    command.lastIndexOf(",")) + 
	        "  STATUS: " + command.substring(command.lastIndexOf("=") + 1));
  }

  public static void main(String args[])
  {
    new ControlElements();
  }

  public void windowClosing    (WindowEvent e) { System.exit(0); }
  public void windowClosed     (WindowEvent e) {   }
  public void windowOpened     (WindowEvent e) {   }
  public void windowIconified  (WindowEvent e) {   }
  public void windowDeiconified(WindowEvent e) {   }
  public void windowActivated  (WindowEvent e) {   }
  public void windowDeactivated(WindowEvent e) {   }

}

A tak wygląda okno programu po uruchomieniu:

Okno programu
« wstecz   dalej »