Laboratorium z informatyki sem. II/ POWTÓRZENIE Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 1
POWTÓRZENIE MATERIAŁU Z ĆWICZEŃ
8 - 12 PRZYKŁADY ZADAŃ NA KOLOKWIUM 2 I. Operacje na tabeli
1. Utwórz aplikację Swing, wyświetlającą tabelę o 8 wierszach i 5 kolumnach, której elementami są całkowite liczby losowe z przedziału [-10, 10].
Kliknięcie przycisku powoduje wylosowanie elementów tabeli oraz obliczenie liczby elementów dodatnich, ujemnych i zerowych, wyświetlenie obliczonych wartości i przedstawienie ich na wykresie kołowym, utworzonym metodami klasy
Graphics.
Wskazówki:
•
Projektowanie interfejsu graficznego: utwórz projekt z klasa główną
JFrame,umieść na ramce tabelę, przycisk, 3 etykiety, 3 pola tekstowe i odpowiednio określ ich właściwości w tym położenie zgodnie z rysunkiem.
W lewym dolnym rogu ramki będziemy tworzyć wykres kołowy.
•
Operacje na tabeli: w klasie głównej zadeklaruj zmienne
ld, lu, lz,
oznaczające liczbę elementów dodatnich, ujemnych i zerowych tabeli. Utwórz metodę akcji przycisku, w której losuj i wyświetlaj wartości elementów tabeli (por. ćw. 9.II) oraz zliczaj elementy dodatnie, ujemne i zerowe (por. ćw. 4.III). Wyświetl wartości
ld, lu, lzw polach tekstowych
.private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Random r = new Random(); //generator liczb losowych//zakres losowania <-10, 10>
int x = 0; //zmienna pomocnicza ld = 0; lu = 0; lz = 0;
for (int i = 0; i < 8; i++) { for (int j = 0; j < 5; j++) { x = -10 + r.nextInt(21);
jTable1.setValueAt(x, i, j);
if (x > 0) { ld++; }
//samodzielnie dodaj instrukcje obliczające liczbę elementów zerowych i ujemnych } }
//samodzielnie wyświetl wyniki w polach tekstowych }
•
Wykres kołowy:
W klasie głównej utwórz metodę
paint(),w której za pomocą metod
setColor() i fillArc()rysuj 3 kolorowe wycinki koła o kątach środkowych odpowiadających wartościom
ld, lu, lz(obliczając te kąty skorzystaj z informacji, że w tabeli jest wygenerowanych 40 wartości, a więc liczbie 40 odpowiada kąt 360. Stąd np. liczbie ld odpowiada kąt 0
360*ld /40
.W metodzie jButton1ActionPerformed (akcji przycisku) wywołaj metodę
repaint(),aktualizującą wykres po wylosowaniu nowych elementów do tabeli.
W efekcie końcowym metoda paint() powinna wyglądać następująco:
public void paint (Graphics g) { super.paint(g);
g.setColor(Color.WHITE);
g.translate(10, getHeight()-160); //przesunięcie grafiki o zadany wektor
//(punkt (0,0) kontekstu graficznego g, znajduje się w punkcie(10,getHeight()-160) g.fillRect(0, 0, 150, 150);// tło
g.setColor(Color.BLUE);
int a1 = (360*ld /40);// kąt pierwszego wycinka w stopniach g.fillArc(0, 0, 150, 150, 0, a1);
g.setColor(Color.red);
int a2 = (360*lu /40 );// kąt drugiego wycinka w stopniach g.fillArc(0, 0, 150,150, a1, a2);
g.setColor(Color.pink);
int a3 = (360*lz /40 );// kąt trzeciego wycinka w stopniach g.fillArc(0, 0, 150, 150, a1+a2, a3); }
Laboratorium z informatyki sem. II/ POWTÓRZENIE Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 2
II. Grafika z animacją, interfejs myszy Z
ADANIA1. Utwórz aplikację, która co 0,6 s wyświetla w losowych miejscach okna ramki Twoje imię. Wybierz dowolną czcionkę oraz kolory tła i napisu.
2. Utwórz aplikację Swing i ustal rozmiar ramki na 300 × 300.
Po naciśnięciu przycisku myszy wyświetlaj na ramce w lewym górnym rogu słowo „LEWY” lub w prawym dolnym rogu słowo „PRAWY” lub po środku ramki słowo ”ŚRODKOWY”, zależnie od użytego przycisku. Tło okna ramki ma być szare, kolor napisu – losowy, a czcionka - MONOSPACED 20 pt.3. Utwórz aplikację Swing i ustal rozmiar ramki na 300 × 300. Na środku ramki narysuj koło o początkowej średnicy 50 pikseli Każde naciśnięcie klawisza Enter zwiększa średnicę kuli o 5 pikseli, ale do wartości nie większej niż wysokości ramki. Każde naciśnięciu klawisza spacji zmniejsza średnicę o 5 pikseli, ale do wartości nie mniejszej niż 10. Kliknięcie klawisza Shift przywraca początkowy rozmiar średnicy koła.
Wskazówki do zadania 1
1. W środowisku NetBeans utwórz aplikację typu Swing z klasą główną o nazwie Zadanie1. W metodzie konstruktora tej klasy określ dowolny rozmiar okna i kolor tła.
2. W klasie Zadanie1 utwórz metodę paint ().
3. Pod nagłówkiem klasy zadeklaruj zmienną przechowującą napis, zmienną przechowującą czcionkę , zmienną do generowania liczb losowych oraz dwie zmienne całkowite x i y, określające współrzędne położenia napisu na ramce :
String s = "Aleksander";
Font f = new Font(Font.SANS_SERIF, Font.BOLD, 20);
Random r = new Random();
int x=20, y=30;
4. W metodzie paint narysuj tło, a następnie losowym kolorem namaluj tekst s czcionką f, począwszy od punktu (x, y):
g.clearRect(0, 0, getWidth(), getHeight());
g.setFont(f);
Color kolor = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
g.setColor(kolor);
g.drawString(s, x, y);
5. Uruchom aplikację.
6. W metodzie paint () wpisz instrukcje, które losują położenie tekstu. Aby cały napis był zawsze widoczny na ramce, uwzględniamy jego szerokość i wysokość w danej czcionce f, oraz dodatkowo uwzględniamy pasek tytułu ramki(30 pikseli, i szerokość krawędzi ramki-10 pikseli):
x = r.nextInt(getWidth() - g.getFontMetrics().stringWidth(s));
y = 30+f.getSize() + r.nextInt (getHeight() – 2*f.getSize()-30);
7. W klasie głównej zaimplementuj interfejs ActionListener, a następnie utwórz obiekt t klasy Timer generujący zdarzenia co 0,6 sekundy.
8. W metodzie actionPerformed() tego interfejsu napisz instrukcję odświeżają grafikę:
repaint();
9. W konstruktorze klasy dodaj instrukcję rozpoczynającą działanie zegara :
t.start();
10. Uruchom aplikację, obserwując losowe położenie tekstu.
Laboratorium z informatyki sem. II/ POWTÓRZENIE Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 3
Wskazówki do zadania 2
1. W środowisku NetBeans utwórz aplikację z klasę główną typu JFrame.
2. Wykonaj punkt 2 z poprzedniego zadania.
3. W klasie głównej zadeklaruj zmienne
String s = ""; // napis
int x=0, y=30; / /położenie napisu
Font f=new Font("MONOSPACED", Font.PLAIN, 20);
4. W metodzie paint () narysuj tło, a następnie namaluj tekst s czcionką f, począwszy od punktu (x, y) 5. W klasie głównej zaimplementuj interfejs MouseListener i odpowiednie jego metody
6. W konstruktorze klasy głównej dodaj nasłuch na interfejs MouseListener instrukcją:
addMouseListener(this);
7. Uzupełnij metodę mousePressed( ) o instrukcje warunkową , sprawdzającą, czy został kliknięty lewy, prawy czy środkowy przycisk myszy;
8. W metodzie paint() w zależności od klikniętego przycisku myszy , przypisz zmiennej s tekst "LEWY" , "PRAWY"
lub „ŚRODKOWY" oraz ustaw odpowiednie wartości zmiennych x i y –odpowiedzialnych za położenie tekstu.
Uwaga: przypisując wartość zmiennej y, pamiętaj, by tekst "LEWY" wyświetlony był poniżej paska tytułu ramki, a tekst "PRAWY” powyżej dolnej krawędzi okna. Tekst „ŚRODKOWY” należy wyśrodkować w poziomie i wpionie
9. Odświeżaj grafikę na ramce po każdym kliknięciu myszy. W tym celu na końcu metody mousePressed( ) dodaj instrukcję repaint();
10. W metodzie paint () dodaj instrukcję warunkową, która namaluje teksts w odpowiednim miejscu, w zależności od tego , który przycisk został kliknięty
11. Uruchom aplikację i sprawdź działanie przycisków myszy.
Wskazówki do zadania 3
1. W środowisku NetBeans utwórz aplikację typu Swing z klasą główną o nazwie Zadanie3. W metodzie konstruktora tej klasy określ rozmiar okna i kolor tła.
2. Pod nagłówkiem klasy zadeklaruj średnicę kuli czyli zmienną całkowitą o nazwie d i wartości początkowej 50 oraz zmienną do generowania liczb losowych
3. W klasie Zadanie3 utwórz metodę paint ()
4.
W metodzie paint narysuj na środku ramki wypełnione koło o średnicy d o dowolnym kolorze.
5.
Dodaj do ramki interfejs KeyListener uzupełniając nagłówek o klauzulę
implements KeyListener, a następnie zaimplementuje wszystkie metody abstrakcyjne tego interfejsu6.
W metodzie konstruktora klasy głównej dodajemy instrukcje :
addKeyListener(this);
setFocusable(true);
7.
W metodzie keyPressed umieść instrukcję, która pobiera kod naciśniętego klawisza oraz odświeża grafikę:
int a = e.getKeyCode();
repaint();
8.
W metodzie keyPressed umieść dodatkowo instrukcję , która sprawdzi czy został naciśnięty klawisz Enter if (a == KeyEvent.VK_ENTER)
{ // tu umieść instrukcje , które zwiększają średnicę d o5 pikseli i sprawdzają//czy średnica jest mniejsza niż szerokość/wysokość ramki pomniejszona o //wysokość paska tytułu
}
9.
W podobny sposób sprawdzaj czy został naciśnięty klawisz Spacji i Shif , wykonując wtedy instrukcje zgodne z treścią zadania
10. Uruchom aplikację i sprawdź działanie klawiszy Enter , spacji i Shift.
Laboratorium z informatyki sem. II/ POWTÓRZENIE Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 4
Zadania do samodzielnego wykonania
1. Utwórz aplikację z klasę główną typu JFrame ustal rozmiar okna ramki na 400 × 400.
Na ramce wyświetl kolejno:
• elipsę wpisaną w prostokąt o bokach 160 x 80,
• kółko o promieniu 50
• trójkąt, którego podstawą jest dolna krawędź okna a wysokość wynosi 50 Ustal dowolny kolor oraz położenie każdej figury.
Kliknięcie myszką przy wciśniętym klawiszu <Shift> czyści obszar graficzny ramki
2. Zmodyfikuj zadanie 1 tak, by promień koła zmieniał się co 0,5 s na wartość losową z przedziału <40, 60>
3. Zmodyfikuj zadanie 1 tak, by kolor trójkąta zmieniał się na losowy co 0,5s
4. Zmodyfikuj zadanie 1 tak by elipsa zmieniała swoje położenie na ramce na losowe , na każde naciśnięcie klawisza Enter.
5. Utwórz aplikację z klasę główną typu JFrame. Po naciśnięciu ramki myszką rysowane jest kółko o promieniu 20, którego środek znajduje się w punkcie wskazanym kursorem myszki. Równoczesne naciśnięcie klawisza Alt powoduje wyczyszczenie ramki . Kolor każdego kółka powinien być losowy.
6. (***)Utwórz aplikację z klasę główną typu JFrame, która umożliwia symulację ruchu koła o promieniu 5 poruszającego się wzdłuż kolejnych krawędzi okna ramki. Ruch rozpoczyna się po kliknięciu myszką na ramce.
Kliknięcie myszką przy wciśniętym klawiszu <Shift> kończy ruch i umieszcza kółko w położeniu początkowym w lewym górnym wierzchołku ramki.