Lekcja 3

Pierwsze okno

I. Klasa JFrame


import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        JFrame okno = new JFrame();
        okno.setSize(1024, 768);
        okno.setTitle("Hello, world!");
        okno.setVisible(true);
    }
}
Zadanie 0

Wydziel kod z metody main do konstruktora nowej klasy, która dziedziczy po JFrame.

Zadanie 1

Aktualnie nasze okno cierpi na tzw. syndrom skypa. Jeśli zamkniemy okno, to nie wyłączamy programu.

Aby zamknięcie danego okna miało spowodować zakończenie działania programu, potrzebujemy dodać w klasie widoku (okna):


// gdy zamykam okno, kończę program
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

II. Grafika komputerowa

Zadanie 2

Nadpisz metodę paint w klasie dziedziczącej po JFrame.

Umieść niebieski okrąg w tworzonym oknie.


class A extends JFrame {
    A() {
        //...
    }
    public void paint(Graphics g) {
        // Ustawiamy kolor pisaka RGB
        g.setColor(new Color(255, 1, 100));
        // W punkcie (512, 512) rysujemy elipsę o wymiarach 40x40
        // Uwaga: punkt (0,0) znajduje się w górnym, lewym punkcie okna
        g.drawOval(512, 512, 40, 40);
    }
}
    
Zadanie 3

Metody getWidth(), getHeight(), służą do pobierania aktualnego rozmiaru okna.

Wylicz współrzędne dla okręgu tak, aby zawsze rysował się po środku okna.

Uwaga: uwzględnij, że nie podajemy (x,y) środka, ale lewo-górnego punktu prostokąta opisującego ten okrag.

Zadanie 4

Uruchom program z poprzedniego zadania i zacznij zmieniać rozmiar okna za pomocą myszy.

Zadanie 5

Uwaga: to zadanie wymaga Javy w wersji do 1.8 włącznie. Przy testach w wersji 11 problem już nie występuje. Ze względu na popularność instalacji wersji 1.7 czy 1.8 na stacjach roboczych, proszę wziąć go pod uwagę (na uczelni mamy dostępne właśnie 1.8).

Napraw błąd widoczny w poprzednim zadaniu.

Można to zrobić wywołując metodę paint z klasy nadrzędnej przed naszym rysowaniem okręgu.

Można też użyć metody clearRect na obiekcie Graphics.

Zadanie 6

Dodaj nowe pola typu int: x, y, radius do tworzonej klasy okna.

Niech metoda paint rysuje okrąg w (x, y) o wielkości radius.

Zadanie 7

Przygotuj listę elementów do rysowania, które będą musiały zaimplementować interfejs:


interface Renderable {
    void render(Graphics g);
}
        

Stwórz klasy: koło, trójkąt, prostokąt. Niech podczas konstrukcji tych obiektów losują się ich parametry (kolor, pozycja, czy wypełnione w środku).

Za pomocą pętli dodaj 20 kształtów do list elementów do rysowania.

Niech okno wyświetli wszystkie te elementy.

Zadanie 8

Spraw, aby można było zapisać każdy kształt do pliku.

Program po wygenerowaniu kształtów (nie w paint!) ma zapisywać całą kolekcję do pliku.

Zadanie 9

Przygotuj nowe okno, które będzie wyświetlało kształty z pliku przygotowanego przez dotychczas napisany kod.

Jeśli odczyt z pliku jest za trudny, uprość format zapisu do pliku.