Laboratorium z informatyki sem. II/ ćw. 12 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 1
MATERIAŁY POMOCNICZE DO ĆWICZENIA 12
Klasa
ArrayList z pakietu java.util- zastosowanie w ćwiczeniuKlasa ArrayList umożliwia tworzenie struktur danych w postaci tablicy o dynamicznie zmieniających się rozmiarach.
Obiekt klasy ArrayList może przechowywać obiekty dowolnego typu a jego rozmiar zmienia się automatycznie przy wywoływaniu metod dodawania i usuwania elementów z tablicy.
Aby zadeklarować i utworzyć nowy obiekt klasy ArrayList o nazwie LK, zastosowaliśmy konstrukcję:
List <KULA> LK = new ArrayList < > ();
Zapis <KULA> oznacza, że elementami listy będą obiekty klasy KULA
W programie wykorzystaliśmy następujące podstawowe metody klasy ArrayList:
ArrayList() – konstruktor klasy,
tworzy pustą listę
add( e ) – dołącza obiekt e jako nowy element na koniec listy
clear() - usuwa z listy wszystkie jej elementy Klasa udostępnia też inne metody, na przykład:
• remove( e )
- usuwa z listy pierwsze wystąpienie podanego obiektu e
• remove( k )
- usuwa z listy element o wskazanym indeksie k
• size()
- zwraca rozmiar listy, odpowiednik własności
lengthw przypadku tablic
• get( k )
– zwraca element o wskazanym indeksie k
Klasa ArrayList jest implementacją interfejsu List, który wchodzi w skład architektury Java Collections Framework., Jest ona przykładem tzw. kolekcji (kontenera), czyli obiektu przechowującego grupę obiektów (elementów kolekcji) o określonej strukturze i udostępniającego operacje na tej strukturze, takie jak dodawanie i usuwanie elementów, pobieranie elementów, sortowanie itp.
Rozszerzona instrukcja pętli for
Jeśli chcemy wykonać jakieś operacje dla każdego elementu tablicy lub kolekcji, można zbudować pętlę
wykorzystując instrukcję for w rozszerzonej postaci (enhanced for lub for-each). Dla zbioru elementów tego samego typu można do przeglądania elementów zastosować pętlę:
for ( typ zmienna : nazwa_zbioru) {
// instrukcje wykonywane dla każdego elementu zbiorui }
Instrukcje pętli są wykonywane dla kolejnych wartości zmiennej, pobieranych ze zbioru wartości (tablicy lub kolekcji).
W naszym programie zastosowaliśmy tę zwięzłą postać instrukcji for aby narysować wszystkie obiekty klasy Kula
zapisane na liście ArrayList o nazwie LK:
for(Kula K : LK){
K.rysuj(g); }
Równanie ruchu wahadła
Ruch wahadła matematycznego w próżni dla małych wychyleń (<30 ) jest opisany równaniem : gdzie - kąt odchylenia od położenia równowagi,
d- długość wahadła g- przyspieszenieziemskie
0 – wychylenie początkowe t - czas
Położenie (x, y) środka ciężarka zawieszonego w punkcie (x0, y0), obliczamy za pomocą wzorów:
x = x0 + d * sin() y = y0 + d * cos()
Wybrane funkcje matematyczne klasy Math
Do symulacji ruchu wahadła można wykorzystać metody klasy Math, zwracające wartości typu double:
sqrt(double x) pierwiastek kwadratowy z liczby x
sin(double x ), cos(double x ) –funkcje trygonometryczne, parametr x jest wartością kąta w radianach
atan2(double y, double x)
–
funkcja zamienia współrzędne kartezjańskie(x, y)n
a współrzędne biegunowe (tzn. kąt i promień) i zwraca kąt (w radianach)W klasie Math jest też dostępna wartość stałej matematycznej
:
Math.PI( )
=
td t
0cos
g
Laboratorium z informatyki sem. II/ ćw. 12 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 2
Konwersja typów liczbowych
W przypadku gdy zmiennej typu double przypisujemy wartość całkowitą, zamiana tej wartości całkowitej na typ rzeczywisty jest dokonywana automatycznie. W przypadku przeciwnym, gdy zmiennej typu całkowitego chcemy przypisać wartość wyrażenia, która jest liczbą rzeczywistą, konieczna jest jawna konwersja typu. Operacja ta wymaga umieszczenia przed wyrażeniem nazwy typu docelowego w nawiasach okrągłych. Na przykład, aby obliczyć całkowitą wartość współrzędnej x (w pikselach) zastosowaliśmy instrukcję:
int x = x0 + (int)(d*Math.sin(alfa));
W wyniku tej konwersji zawsze jest obcinana część dziesiętna liczby rzeczywistej. Jeśli wartość rzeczywista ma być zaokrąglona do najbliższej liczby całkowitej, można oprócz konwersji zastosować metodę round() klasy Math:
int x = x0 + (int)Math.round((d*Math.sin(alfa)));
Interfejs KeyListener i klasa KeyEvent
Do obsługi klawiatury wykorzystujemy interfejs KeyListener, który zawiera metody obsługujące zdarzenia
wciśnięcia/zwolnienia klwiszy.. Interfejs KeyListener zawiera trzy metody i podobnie jak interfejs MouseListener należy do pakietu Javy java.awt.event oraz dziedziczy od zdefiniowanego w pakiecie java.util (pustego) interfejsu
EventListener.
public interface KeyListener extends EventListener { public void keyPressed(KeyEvent e); //wciśnięcie klawisza public void keyTyped(KeyEvent e); //wpisanie znaku public void keyReleased(KeyEvent e); //zwolnienie klawisza }
Parametrem każdej z powyższych metod jest obiekt klasy KeyEvent, reprezentujący zdarzenie związane z użyciem klawiatury.
Klasa KeyEvent udostępnia m.in. metody:
int getKeyCode() - metoda zwracająca kod naciśniętego klawisza
char getKeyChar()- metoda zwracająca znak związany z klawiszem Klasa KeyEvent dziedziczy też metody klasy InputEvent, są to m.in.:
boolean isControlDown()- metoda zwracająca wartość true, gdy wciśnięty jest klawisz <Ctrl>, w przeciwnym przypadku metoda zwraca wartość false.
analogicznie metody isAltDown() i isShiftDown()dotyczą klawiszy <Alt> i <Shift>
Do określenia kodu klawisza można wykorzystać stałe zdefiniowane w klasie, tzw.klawisze wirtualne, są to np:
VK_A – klawisz A, ... VK_Z – klawisz Z, VK_0 – klawisz 0, ... VK_9 – klawisz 9,
VK_ALT – klawisz Alt, VK_BACK_SPACE – klawisz Backspace,
VK_SPACE – klawisz spacji, VK_ENTER – klawisz Enter,
VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN – klawisze strzałek
Aby wykorzystać w klasie interfejs KeyListener należy:
• dopisać w nagłówku klasy słowa: implements KeyListener
• zaimportować ten interfejs
• zaimplementować wszystkie jego abstrakcyjne metody, usunąć w ich treściach instrukcje throw ...
• w konstruktorze tej klasy dopisać instrukcje umożliwiające obsługę i nasłuch zdarzeń klawiatury:
setFocusable(true);
addKeyListener(this);
Menedżer układu graficznego, metoda setLayout
Dla kontenera wewnątrz którego będą umieszczane inne komponenty (takiego jak ramka lub panel) można określić układ, od którego zależy wygląd i rozmieszczenie komponentów w pojemniku.
Metoda setLayout określa menedżer układu dla pojemnika.
Java udostępnia szereg menedżerów układu, zarządzających rozmieszczeniem komponentów w kontenerach. Są to m.in.
• BorderLayout – dzieli obszar pojemnika na 4 regiony brzegowe i 1 centralny; w każdym umieszcza jeden komponent,
• GridLayout – dzieli obszar pojemnika na dwuwymiarową siatkę do której dodawane są kolejne komponenty.
• FlowLayout – dodaje komponenty od lewej do prawej, przenosząc w razie potrzeby do nowego „wiersza”,
• BoxLayout – dodaje komponenty do pojemnika, umieszczając po jednym w „wierszu”.
Jeśli chcemy samodzielnie rozmieścić komponenty w kontenerze i zmieniać dowolnie ich rozmiary, można odłączyć menedżer układu za pomocą metody setLayout(null).