PWŚG Ćwiczenia 13 Ukończoną pracę należy przesłać na adres email: sara.m.jurczyk@gmail.com lub sarajurczyk@kul.lublin.pl Zadanie. Stwórz aplikację stawiającą stemple w postaci figur geometrycznych: koło, kwadrat, elipsa, prostokąt. Użytkownik może wybrać rodzaj stawianej figury z listy rozwijanej. 1. Utwórz nowy projekt o nazwie Stemple. 2. Dodaj nową formatkę (New -> JFrame Form) o nazwie OknoLosoweFig, a następnie zaprojektuj wygląd aplikacji:
a. Użytkownik może wybrać rodzaj stawianej figury z listy rozwijanej (JComboBox) umieszczonej na Panelu1. Pozycje listy rozwijanej to: Koło, Kwadrat, Elipsa oraz Prostokąt, które należy umieścić pod Properties -> model: b. Komponent na którym stawiane są stemple to JPanel2 c. Aplikacja posiada menu (komponent MenuBar). Pozycje menu zawierają: Plik/Zamknij powoduje zamknięcie aplikacji (komponent MenuItem) Edycja/Zapisuj umożliwia zapisywanie stemplów na panelu (domyślnie znikają) (komponent MenuItem / CheckBox) Edycja/Czyść czyści panel i historie zapisanych stempli (komponent MenuItem) 3. Następnie napisz klasę słuchacza (New -> Java Class) o nazwie MojSluchacz implementującego interface MouseListener oraz zdefiniuj dla niego metodę mousepressed, która narysuje stawianego stempla przy pomocy metod DrawXXX() obiektu Graphics, który zwraca panel.
a. Klasa słuchacza powinna mieć następujące pola prywatne: tlo typu JPanel, do przechowywania referencji do panelu na którym będą rysowanie kształty boks typu JComboBox, dla dostępu do informacji jaki kształt ma być stemplowany na panelu tlo, szer, wys aby określić rozmiary kształtu. b. Dodaj potrzebne metody, takie jak konstruktor, gettery i settery. c. W metodzie mousepressed powinniśmy sprawdzić jaka figura jest wybrana w boks, a następnie narysować ją na panelu tlo: d. Dodaj pozostałe metody, które wymagają implementacji. Definicje metod pozostaw puste:
4. W konstruktorze klasy JFrame (w OknoLosoweFig -> Source) zadeklaruj i zdefiniuj obiekt słuchacza typu MojSluchacz (przypisz odpowiedni panel i ComboBox z aplikacji) oraz dodaj go do panelu (metodą addmouselistener), na którym będziemy stawiać stemple: 5. Aby po uruchomieniu aplikacji formatka była widoczna, dodaj w funkcji main głównej klasy kod: OknoLosoweFig mf = new OknoLosoweFig(); mf.setvisible(true); Na tym etapie klikając myszką na panel powinniśmy stawiać wybraną z listy figurę. Narysowane figury znikają jednak po odmalowaniu aplikacji, np. na skutek zminimalizowania okna. W następnych krokach wyeliminujemy tą sytuację. 6. Aby zapobiec znikaniu figur, napiszemy dodatkową klasę (o nazwie np. MojPanel) dziedziczącą po typie JPanel, która będzie miała pole pamiec typu HashSet do przechowywania informacji o narysowanych figurach. Dla wygody zdefiniujemy również klasę Ksztalt, która będzie reprezentować figurę, tj. współrzędne x i y, wysokość, szerokość oraz nazwa figury. a. Utwórz klasę (New -> Java Class) o nazwie Ksztalt posiadającą pola prywatne: b. Do klasy kształt dodaj konstruktor ustawiający wartości pól na podstawie parametrów, a także wszystkie gettery i settery. c. Utwórz teraz klasę (New -> Java Class) o nazwie MojPanel dziedziczącą po JPanel. Klasa ta powinna posiadać prywatne pole pamiec typu HashSet:
d. W klasie MojPanel umieść definicję konstruktora oraz implementację metody paint w której będą odmalowywane zapamiętane figury w polu pamiec: e. W klasie MojPanel umieść także definicję metody getpamiec() : 7. Aby użyć obiektu utworzonej w poprzednim kroku klasy MojPanel zamiast JPanel, należy kliknąć prawym przyciskiem myszy na panel aplikacji (tu: jpanel2), wybrać Customize Code, a następnie w części Initialization code, zmienić opcję default code na custom creation i zdefiniować ten panel jako obiekt klasy MojPanel wpisując: jpanel2 = new MojPanel();
8. Zapisywanie będzie włączone tylko jeżeli zostanie zaznaczona opcja Zapisuj z menu. W tym celu: a. Dodaj do klasy MojSluchacz prywatne pole logiczne o nazwie zapisuj: b. Zmodyfikuj konstruktor tej klasy tak, aby domyślnie opcja zapisu była wyłączona: if( zapisuj ) c. Dodaj metodę get oraz metodę set dla utworzonego pola zapisuj (pamiętaj, że skoro mamy do czynienia z polem logicznym metoda get przyjmuje postać iszapisuj() ). d. W metodzie mousepressed tej klasy oprócz namalowania nowej figury możemy teraz stworzyć obiekt typu Ksztalt i dodać go do pamiec jeżeli zapisuj == true. W tym celu dodaj do metody mousepressed poniży kod: ((MojPanel)tlo).getPamiec().add( new Ksztalt(me.getX()-szer/2, me.gety()- szer/2, szer, szer, boks.getselecteditem().tostring()) );
e. Ostatnim krokiem będzie oprogramowanie zaznaczenia opcji zapisuj w menu, tj. Implementacja metody actionperformed. W tym celu kliknij prawym przyciskiem myszy na opcji zapisuj w menu, a następnie wybierz Events -> Action -> actionperformed: Metoda ta powinna posiadać następującą implementację: Na tym etapie zaznaczenie opcji zapisuj w menu powoduje zapis dodanych figur. Narysowane figury NIE znikają już po odmalowaniu aplikacji, np. na skutek minimalizacji, czy zmiany rozmiaru okna.
9. Pozostało jeszcze oprogramowanie opcji Czyść z menu głównego. W tym celu kliknij prawym przyciskiem myszy na opcji Czyść w menu, a następnie wybierz Events -> Action -> actionperformed i umieść w metodzie actionperformed kod: ((MojPanel)jPanel2).getPamiec().clear(); // usunięcie figur z pamięci ((MojPanel)jPanel2).repaint(); 10. Aby oprogramować opcję menu Zamknij, dodaj do jej metody actionperformed kod: System.exit(0);