Piąte zajęcia ze Smalltalka.
Przegląd ważniejszych widgetów i ich własności
- Etykieta
- Nazwa: Label
- Opis:
Reprezentuje (jednowierszowy) tekst wpisany w okienku. Użytkownik nie może zmieniać tego tekstu, program może.
- Własności:
- String: tekst etykiety,
- ID: identyfikator widgeta, potrzebny przy odwoływaniu się do niego z poziomu programu.
- Stosowanie:
- Zmiana etykiety (o identyfikatorze #id) podczas działania programu:
(self builder componentAt: #id) labelString: 'tekst'.
- Przycisk
- Nazwa: Action Button
- Opis:
Reprezentuje przycisk wywołujący wykonywanie pewnej akcji.
- Własności:
- String: tekst etykiety na przycisku,
- Action: komunikat (bezargumentowy), który będzie wysłany do aplikacji (podklasy ApplicationModel), gdy użytkownik naciśnie ten przycisk,
- ID: identyfikator widgeta, potrzebny przy odwoływaniu się do niego z poziomu programu.
- Stosowanie:
- Należy zdefiniować w aplikacji metodę o takiej samej nazwie jak własność Action przycisku
- Zamykanie okna:
self closeRequest
- Pole tekstowe
- Nazwa: Input Field
- Opis:
Reprezentuje pole tekstowe, do którego użytkownik może wpisywać dane (tekst).
- Własności:
- Aspect: nazwa metody, która ma dawać wartość zapisaną w polu tekstowym,
- ID: identyfikator widgeta, potrzebny przy odwoływaniu się do niego z poziomu programu.
- Stosowanie:
- Pole tekstowe używa osobnego obiektu (tzw. modelu wartości , ang. value model) do przechowywania swojej bieżącej wartości. Polecenie Define deklaruje taką zmienną instancyjną i definiuje dla niej akcesor z leniwą inicjalizacją. Jeśli program chce odczytać lub zapisać wartość przechowywaną w polu tekstowym, to robi to, korzystając (poprzez akcesor) z tej zmiennej obiektowej. Nazwą tego akcesora jest symbol podany jako własność Aspect.
- Odczytując wartość zapisaną w polu tekstowym należy się posłużyć metodą value, zaś zapisując value:.
- Można określić zarówno typ dozwolonych zapisów wprowadzanych do pola tekstowego jak i format ich wyświetlania.
- Lista
- Nazwa: List
- Opis:
Reprezentuje listę etykiet
- Własności:
- Aspect: nazwa metody, która ma daać model listy przedstawionej w tym widgecie,
- ID: identyfikator widgeta, potrzebny przy odwoływaniu się do niego z poziomu programu.
- Stosowanie:
- Lista używa osobnego obiektu (tzw. modelu wartości , ang. value model) do przechowywania swojej bieżącej wartości. Jest to obiekt klasy SelectionInList zawierający listę etykiet i indeks wybranej na liście etykiety. Polecenie Define deklaruje taką zmienną instancyjną i definiuje dla niej akcesor z leniwą inicjalizacją. Jeśli program chce odczytać lub zapisać wartości przechowywane w liście, to robi to, korzystając (poprzez akcesor) z tej zmiennej obiektowej. Nazwą tego akcesora jest symbol podany jako własność Aspect.
- Odczytując wartość zapisaną w liście należy się posługiwać metodami:
- selection - bieżący obiekt na liście (lub nil gdy takiego nie ma),
- selectionIndex - indeks bieżącego obiektu na liście (lub 0 gdy takiego nie ma),
- selection: - zmiana wartości bieżącego obiektu na liście,
- selectionIndex: - zmiana indeksu bieżącego obiektu na liście,
- list - pobranie całej listy,
- list: - ustalenie nowej listy,
- selectionIndexHolder - obiekt (value holder) zawierający w sobie indeks bieżącej pozycji.
Uwaga 1: jeśli chcemy coś dodać lub usunąć z listy, to musimy najpierw pobrać całą listę metodą list, potem ja zmienić i znów ustawić metodą list:. (Bez tego ostatniego nie zmienimy wyświetlanej zawartości listy).
Uwaga 2: Jeśli aplikacja chce śledzić zmiany wyboru bieżącego elementu na liście, to powinna w swojej metodzie initialize w poniższy sposób zgłosić swoje zainteresowanie tymi zmianami:
aSelectionInList selectionIndexHolder
onChangeSend: #zmieniloSie to: self.
i oczywiście zdefiniować metodę zmieniloSie.
Zadanie
Implementowanie GUI dla klasy Relacja cz. 2: powiązanie z obiektem Relacja.
(w pliku RelacjaGUI.st znajduje się rozwiązanie).