Programowanie Obiektowe Java

Podobne dokumenty
Kontynuacja wprowadzenia do SWING. Przykłady implementacji wybranych komponentów

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wykład 8: Obsługa Wyjątków

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Struktura programu: package pl.mojastrona.mojpakiet; import javax.swing.*; import java.awt.container; class MojaKlasa extends Jframe {

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Programowanie obiektowe

Programowanie w Javie Wykład 6 Okienka w Javie (AWT)

Klasy abstrakcyjne. Klasę abstrakcyjną tworzymy przy pomocy modyfikatora abstract

Java - interfejs graficzny

Programowanie obiektowe

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

SWING. dr Jarosław Skaruz

Programowanie Obiektowe Ćwiczenie 4

Podstawy Języka Java

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Programowanie graficznych interfejsów użytkownika

Java SE Laboratorium nr 5. Temat: Obsługa zdarzeń

Kontenery i komponenty graficzne

Programowanie zdarzeniowe

Aplikacje w środowisku Java

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

Aplikacja wielowątkowa prosty komunikator

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Dokumentacja do API Javy.

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

Programowanie obiektowe

LABORATORIUM 7 Cel: 1_1

Programowanie obiektowe

Języki i metody programowania Java Obsługa zdarzeń - przykłady

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

GUI - projektowanie interfejsów cz. II

Graphic User Interfaces pakiet Swing

Podstawy i języki programowania

Wyjątki (exceptions)

Tworzenie elementów graficznych

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Java biblioteka Swing

Programowanie zdarzeniowe

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Java SE Laboratorium nr 4. Temat: Obsługa wyjątków i zdarzeń

Klasy cd. Struktury Interfejsy Wyjątki

SWING ZAGADNIENIA: wprowadzenie, kontenery I komponenty, LayoutManager, komponenty tekstowe.

Programowanie obiektowe

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Programowanie obiektowe

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie Obiektowe GUI

Aplikacja wielow tkowa prosty komunikator

Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy. Tworzenie łącz w apletach

Programowanie w języku Java

Wykład 04. Programowanie obiektowe. Maciej Wołoszyn 17 marca Spis treści

Podstawy Swing. Tomasz Borzyszkowski

Języki i metody programowania Java. Wykład 2 (część 2)

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki

Metody Metody, parametry, zwracanie wartości

Projektowanie aplikacji internetowych laboratorium

Marcin Luckner Warsaw University of Technology Faculty of Mathematics and Information Science

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Informatyka i Ekonometria Programowanie komputerów Ćwiczenia Tworzenie aplikacji wykorzystaniem graficznego interfejsu użytkownika - Swing.

Ćwiczenia 9 - Swing - część 1

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Kurs programowania. Wykład 4. Wojciech Macyna. 23 marca 2016

Programowanie obiektowe i zdarzeniowe

Zaawansowane aplikacje WWW - laboratorium

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Tworzenie i obsługa graficznego interfejsu uŝytkownika

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Rozdział 4 KLASY, OBIEKTY, METODY

Języki i metody programowania Java Lab2 podejście obiektowe

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

Wykład 4_1. Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Multimedia JAVA. Historia

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Wykład 7: Pakiety i Interfejsy

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Dawid Gierszewski Adam Hanasko

Język Java część 2 (przykładowa aplikacja)

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Pierwsza ramka. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 10

package pakieta; import pakietb.b; package pakietb; public class B { B(){} public class A { private B b; A(B b) { this.b = b; } }

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Transkrypt:

Programowanie Obiektowe Java Małgorzata Janik Zakład Fizyki Jądrowej malgorzata.janik@pw.edu.pl http://java.fizyka.pw.edu.pl/

Przenoszenie projektów Import & Export

Eksportowanie projektu do pliku zip: File Export General Archive File Export Export General Archive File General Archive File Export General Archive File To archive file: (podać ścieżkę przy użyciu przycisku Browse). Export General Archive File Finish http://realsearchgroup.org/sematerials/tutorials/import_export/index.html#section2_0

Importowanie projektu do Eclipse: File -> Import -> General Existing Projects into Workspace -> Select archive file: http://realsearchgroup.org/sematerials/tutorials/import_export/index.html#section2_0

Import wielu pakietów na raz: * np. import java.awt.*; import javax.swing.*;

Wyjątki czyli jak sobie radzić z nagłymi problemami

Obsługa błędów za pomocą wyjątków Najlepiej oczywiście wyłapać wszystkie możliwe błędy jeszcze przed uruchomieniem programu Nie zawsze jednak jest to takie proste Pozostałe błędy trzeba obsłużyć podczas wykonywania programu, przekazując informację o wystąpieniu problemu do odbiorcy, który będzie wiedział co zrobić z zainstniałym problemem W starszych językach np. wyrzucano na ekran odpowiedni status błędu. To niestety jest bardzo trudne w implementacji trzeba przewidzieć KAŻDY MOŻLIWY PROBLEM. Nowoczesnym sposobem jest obsługa sytuacji wyjątkowych (ang. exception handling) 7/116

Krótka powtórka H. Zbroszczyk, Języki Programowania, Wykład 13 http://www.if.pw.edu.pl/~gos/students/jp/po/wyklad13-2017.pdf 8/116

Sytuacje wyjątkowe Sytuacje, które mogą mieć miejsce, chociaż nie muszą 9/116

Sytuacje wyjątkowe Sytuacje, które mogą mieć miejsce, chociaż nie muszą np. kiedy funkcja nie może z jakiegoś powodu wykonać się poprawnie Poprawnie napisany program powinien przewidzieć ich wystąpienie i zaradzić na taką sytuację Sytuacją wyjątkową może być wszystko co za takową zostanie uznane zwykle jest to problem, który wstrzymuje wykonywanie metody lub bloku 10/116

Jak napisać poprawnie program z obsługą sytuacji wyjątkowych? 1) Określić, gdzie zaczyna się obszar spodziewanego wystąpienia sytuacji wyjątkowej Blok try 2) W przypadku wystąpienia sytuacji wyjątkowej należy zasygnalizować jej wystąpienie Instrukcja throw 3) Reakcja na wystąpienie sytuaciji wyjątkowej Blok catch 11/116

Co może pójść nie tak? public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); Wczytywanie liczb z klawiatury od użytkownika licznik = sc.nextint(); mianownik = sc.nextint(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); sc.close(); 12/116

Co może pójść nie tak? public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); Wczytywanie liczb z klawiatury od użytkownika licznik = sc.nextint(); mianownik = sc.nextint(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); sc.close(); A JEŚLI PODZIELI PRZEZ 0???!!! Spróbujmy się zabezpieczyć 13/116

Co może pójść nie tak? public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); licznik = sc.nextint(); mianownik = sc.nextint(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); sc.close(); Określamy obraszar spodziewanej sytuacji wyjątkowej i wkładamy go w blok try 14/116

Co może pójść nie tak? public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); try{ licznik = sc.nextint(); mianownik = sc.nextint(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); sc.close(); Określamy obraszar spodziewanej sytuacji wyjątkowej i wkładamy go w blok try 15/116

Co może pójść nie tak? public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); try{ licznik = sc.nextint(); mianownik = sc.nextint(); Sygnalizujemy problem: wyrzucenie wyjątku (instrukcja throw) if(mianownik==0) throw new ArithmeticException(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); catch(arithmeticexception e){ System.out.println("Nie mogę podzielić przez zero! Podaj inną liczbę."); sc.close(); 16/116

Co może pójść nie tak? public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); try{ licznik = sc.nextint(); mianownik = sc.nextint(); Złapanie wyjątku i reakcja na wystąpienie sytuacji wyjątkowej (blok catch) if(mianownik==0) throw new ArithmeticException(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); catch(arithmeticexception e){ System.out.println("Nie mogę podzielić przez zero! Podaj inną liczbę."); sc.close(); 17/116

Czy zawsze w takiej sytuacji należy używać wyjątków? Nie! Wyjątki służą do obsługi sytuacji wyjątkowych. Jeśli spodziewasz się, że sytuacja może się często powtarzać, należy użyć zwykłego sprawdzenia programowego : np. if (mianownik==0) System.out.println("Nie mogę podzielić przez zero! Podaj inną liczbę."); Czyli: do rutynowych sprawdzeń w sytuacjach będących częścią zwykłego działania programu lepiej użyć sprawdzenia programowego ; wyjątki powinny nam sugerować, że wystąpił błąd działania programu. 18/116

Jak napisać poprawnie program z obsługą sytuacji wyjątkowych? 1) Określić, gdzie zaczyna się obszar spodziewanego wystąpienia sytuacji wyjątkowej Blok try try{ 2) W przypadku wystąpienia sytuacji wyjątkowej należy zasygnalizować jej wystąpienie Instrukcja throw throw new NazwaWyjatkuException(); 3) Reakcja na wystąpienie sytuaciji wyjątkowej (wyłapanie wyjątku) Blok catch catch(nazwawyjatkuexception e) { 19/116

Chwila, chwila Chyba już gdzieś widzieliśmy coś, co wygląda jak wyjątki, chociaż żadnych try-catch w kodzie nie było. Exception in thread "main" java.util.inputmismatchexception at java.util.scanner.throwfor(scanner.java:864) at java.util.scanner.next(scanner.java:1485) at java.util.scanner.nextint(scanner.java:2117) at java.util.scanner.nextint(scanner.java:2076) at wyk4.dzielenieprzezzero.main(dzielenieprzezzero.java:17) Exception in thread "main" java.lang.arithmeticexception: / by zero at wyk4.dzielenieprzezzero.main(dzielenieprzezzero.java:20) Exception in thread "main" java.lang.nullpointerexception at wyk4.dzielenieprzezzero.jakasfunkcja(dzielenieprzezzero.java:9) at wyk4.dzielenieprzezzero.main(dzielenieprzezzero.java:33) 20/116

Wyjątki zgłaszane przez Javę Wyjątki mogą być zgłaszane zarówno przez programistę (throw), jak i przez wirtualną maszynę Javy. Java w wielu przypadkach sama wyrzuca wyjątek gdy napotka problem, więc często możemy pominąć instrukcję throw. Jednakże, jeśli takiego wyjątku nie obsłużymy, to cały progam się wykrzaczy z błędami w konsoli: Exception in thread "main" java.lang.nullpointerexception at wyk4.dzielenieprzezzero.jakasfunkcja(dzielenieprzezzero.java:9) at wyk4.dzielenieprzezzero.main(dzielenieprzezzero.java:33) Żeby temu zapobiec, należy w kodzie umieścić instrukcje wyłapujące takie wyjątki (czyli blok try-catch). Bądź zapobiec sytuacji która powoduje generowanie wyjątku. 21/116

Wyjątki zgłaszane przez Javę public class DzieleniePrzezZero { public static void main(string[] args) { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); try{ licznik = sc.nextint(); mianownik = sc.nextint(); Java sama sobie wyrzuci wyjątek w momencie dzielenia przez zero if(mianownik==0) throw new ArithmeticException(); int wynik = licznik/mianownik; System.out.println("Wynikiem dzielenia jest: "+wynik); catch(arithmeticexception e){ System.out.println("Nie mogę podzielić przez zero! Podaj inną liczbę."); sc.close(); 22/116

Obsługa kilku wyjątków jednocześnie try { //kod który może zgłosić wyjątki catch (TypWyjatku1 w) { //obsługa wyjątków Typ1 catch (TypWyjatku2 w) { //obsługa wyjątków Typ2 catch (TypWyjatku3 w) { //obsługa wyjątków Typ3 finally{ //instrukcje wykonane niezależnie od tego czy wyjątek wystąpił, czy nie... 23/116

Obsługa kilku wyjątków jednocześnie try { //kod który może zgłosić wyjątki catch (TypWyjatku1 w) { //obsługa wyjątków Typ1 catch (TypWyjatku2 w) { //obsługa wyjątków Typ2 catch (TypWyjatku3 w) { //obsługa wyjątków Typ3 finally{ finally wykona się zawsze: tutaj zwykle będziemy sprzątać (zamykać otwarte połączenia, itp.). //instrukcje wykonane niezależnie od tego czy wyjątek wystąpił, czy nie... 24/116

Obsługa kilku wyjątków jednocześnie public class KilkaWyjatkow { public static void main(string[] args) { int[] licznik = {1, 2, 3, 0 ; int[] mianownik = {2, 0, 1, 0, 5; double ulamek = 0.0; for (int i=0; i<6; i++){ try{ ulamek = (double) ( licznik[i]/mianownik[i] ); catch (IndexOutOfBoundsException e) { System.out.println("Indeks tablicy poza zakresem"); catch (ArithmeticException e) { System.out.println("Proba dzielenia przez zero"); finally { System.out.println("Blok finally wykonany zawsze"); System.out.println("wartosc zmiennej ulamek: " + ulamek); //koniec petli for // koniec metody main() 25/116

Jednoczesne przechwytywanie kilku wyjątków jednym blokiem catch try { //kod który może zgłosić wyjątki catch (TypWyjatku1 TypWyjatku2 w) { //obsługa wyjątków Typ1 lub Typ2 26/116

Jednoczesne przechwytywanie kilku wyjątków jednym blokiem catch public class KilkaWyjatkow2 { public static void main(string[] args) { int[] licznik = {1, 2, 3, 0 ; int[] mianownik = {2, 0, 1, 0, 5; double ulamek = 0.0; for (int i=0; i<6; i++){ try{ ulamek = (double)(licznik[i]/mianownik[i]); catch (IndexOutOfBoundsException ArithmeticException e) { System.out.println("Przechwycony wyjatek: " + e.getclass().getname()); //koniec petli for // koniec metody main() 27/116

Zagnieżdżanie bloków try-catch Instrukcja try może występować w bloku instrukcji innej instrukcji try. Konstrukcja taka powoduje, że wyjątki zgłaszane przez wewnętrzy blok try będą posiadały swój kontekst wywołania, inny niż wyjątki bloku zewnętrznego. Jeżeli wewnętrzny blok try zgłosi wyjątek, dla którego nie posiada odp. sekcji catch, będzie przeszukiwany kontekst bloku zewnętrznego w poszukiwaniu odpowiedniej sekcji catch. 28/116

public class ZagniezdzanieWyjatkow1{ public static void main(string[] args) { int[] licznik = {1, 2, 3, 0 ; int mianownik[] = {2, 0, 1, 0, 5; double ulamek = 0.0; try{ for (int i=0; i<6; i++){ int l=0, m =0; try{ l = licznik[i]; m = mianownik[i]; ulamek = (double) (l/m); // zglosi wyjatek zewnetrzny System.out.println(ulamek); catch (IndexOutOfBoundsException e) { System.out.println("Indeks tablicy poza zakresem"); System.out.println("Wyjątek z bloku wewnetrznego - przejscie do kolejnej iteracji petli"); //koniec petli for catch(arithmeticexception e){ System.out.println("Proba dzielenia przez zero"); System.out.println("Wyjątek z bloku zewnetrznego - koniec petli"); 29/116

Zagnieżdżanie bloków try-catch ca tc h ArithmeticException e t ca ch catch wewnętrzny, sprawdza najpierw, ale w tym wypadku łapie tylko IndexOutOfBoundsException catch zewnetrzny, jeśli wewnętrzny nie złapał to ten łapie Obrazek sitka z: https://www.ceneo.pl/43826715, dostęp: 11.03.2018 30/116

Łapanie wyjątków obsługa wyjątku nie musi nastąpić w tej samej funkcji, w której wyjatek został wyrzucony cała idea wyjątków opiera się na pomyśle, że nie potrafimy rozwiązać problemów w danym kontekście więc delegujemy go dalej (do kodu, który go złapie procedury obsługi wyjątku) tak jak w przykładzie z zagnieżdżaniem, możemy go np. wysłać do zewnętrznego bloku try Jak przechwycić wyjątki w innej funkcji?

throws Jeśli metoda zgłasza wyjątek, którego sama nie obsługuje, to deklaracja metody musi zawierać informację o tym. Służy do tego słowo kluczowe throws, umieszczane po deklaracji metody, a po nim wymieniane są typy wszystkich wyjątków zgłaszanych przez metodę (za wyjątkiem Error i RuntimeException i ich podklas). Ogólna postać definicji metody zgłaszającej nieobsługiwane wyjątki : typ nazwa_metody(lista-parametrów) throws lista-wyjątków { // ciało metody 32/116

throws public static void Funkcja() throws ArithmeticException { Te wyjątki zostaną wyrzucone z funkcji int licznik; int mianownik; i trzeba je złapać gdzieś indziej System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); licznik = sc.nextint(); mianownik = sc.nextint(); if(mianownik==0) throw new ArithmeticException(); int wynik = licznik / mianownik; System.out.println("Wynikiem dzielenia jest: " + wynik); sc.close(); 33/116

throws public static void Funkcja() throws ArithmeticException { int licznik; int mianownik; System.out.println("Podaj dwie liczby:"); Scanner sc = new Scanner(System.in); licznik = sc.nextint(); mianownik = sc.nextint(); if(mianownik==0) throw new ArithmeticException();Trafiają do miejsca, gdzie int wynik = licznik / mianownik; funkcja została wywołana. System.out.println("Wynikiem dzielenia jest: " + wynik); public static void main(string[] args) { sc.close(); try{ Funkcja(); catch(arithmeticexception e){ System.out.println("Nie mogę podzielić przez zero! Podaj inną liczbę."); 34/116

throws wygląda znajomo? Headless to taki tryb, gdy działamy na maszynie, która nie ma ekranu, klawiatury i/lub myszki np. serwer ukryty gdzieś w szafie do którego się łączymy tylko zdalnie Część komponentów graficznych JFrame, JColorChooser,JDialog, JFileChooser wyrzuca wyjątek HeadlessException, jeśli zostanie utworzona pracując w takim trybie. Kod w ten sposób upewnia się, że zauważymy problem z obsługą okienka, którego nie widać (brak ekranu) i z którym nie można wejść w interakcje (brak klawiatury / myszki) 35/116

Czym właściwie są wyjątki? Wyjątek w Java jest obiektem, który opisuje sytuację błędną powstałą w kodzie. Wszystkie wyjątki i błędy są podklasami klasy Throwable. Podklasami klasy Throwable są: Klasa Exception i potomne; służą do opisywania sytuacji błędnych, które mogą być spowodowane przez kod użytkownika lub mogą być przez kod użytkownika wykryte i obsłużone. Klasa Error i potomne; są używane przez maszynę wirtualną do zgłaszania błędów fatalnych, takich jak: OutOfMemoryError, VirtualMachineError, LinkageError...

37/116

Błędy - Error Wyjątki dziedziczące po Error reprezentują poważne problemy, których aplikacja nie będzie w stanie rozwiązać. Przykładową podklasą jest VirtualMachineError. Wystąpienie takiego wyjątku oznacza, że maszyna wirtualna nie może dalej kontynuować pracy, np. z powodu wyczerpania się zasobów systemowych. Wyjątków rozszerzających Error nie należy przechwytywać, gdyż nie ma możliwości zaradzenia sytuacjom wyjątkowym, które je spowodowały. Z założenia te wyjątki mogą wystąpić praktycznie w każdej instrukcji kodu i nie muszą być wymieniane w klauzulach throws. 38/116

Wyjątki - Exceptions Wyjątki dziedziczące po Exception reprezentują sytuacje, na które dobrze napisana aplikacja powinna być przygotowana. To właśnie tę klasę rozszerza się tworząc własne rodzaje wyjątków. Jej przykładowe podklasy to: IOException - sytuacje wyjątkowe związane z wejściem/wyjściem, ClassNotFoundException - maszyna wirtualna nie odnalazła klasy o nazwie podanej w opisie wyjątku, SQLException - wyjątki związane z dostępem do bazy danych SAXParseException, która wskazuje, że podczas parsowania dokumentu XML wystąpił błąd. 39/116

40/116

Klasa RuntimeException Bardzo ciekawą podklasą Exception jest RuntimeException, która sama posiada wiele podklas. Takie wyjątki są zgłaszane automatycznie przez Javę i nie trzeba włączać ich w specyfikacji wyjątków. Wyjątki rozszerzające RuntimeException mogą wystąpić podczas typowych operacji, jak rzutowanie zmiennej, odwołanie się do elementu tablicy lub odwołanie się do składowej obiektu. Ich wystąpienie zazwyczaj oznacza, że programista popełnił błąd w swoim kodzie lub nieumiejętnie korzystał z kodu napisanego przez innych. 41/116

Klasa RuntimeException Przykładowymi podklasami RuntimeException są: ClassCastException - oznacza próbę rzutowania zmiennej na niepasujący typ, IndexOutOfBoundsException - oznacza odwołanie się do indeksu z poza zakresu NullPointerException - oznacza że zamiast referencji wskazującej na obiekt pojawiła się wartość null (np. obiekt nie utworzony) IllegalArgumentException - oznacza, że do metody przekazany został niewłaściwy argument 42/116

Klasa RuntimeException Wyjątki RuntimeException oznaczają zwykle błąd programisty, dlatego praktycznie nigdy nie przechwytuje się takich wyjątków. Co się wtedy dzieje z takim wyjątkiem? Przedostaje się przez wszystkie wywołania na zewnątrz (jak każdy inny wyjątek) aż trafi do metody main(). Jeśli tam też nie zostanie złapany, to przed wyjściem z programu wywoływana jest dla niego metoda printstacktrace(); Jeśli zobaczymy taki wyjątek, to zwykle znaczy, że musimy coś poprawić w naszym kodzie. 43/116

Klasa RuntimeException Exception in thread "main" java.util.inputmismatchexception at java.util.scanner.throwfor(scanner.java:864) at java.util.scanner.next(scanner.java:1485) Wyjątki RuntimeException oznaczają zwykle błąd at java.util.scanner.nextint(scanner.java:2117) at java.util.scanner.nextint(scanner.java:2076) programisty, dlatego praktycznie nigdy nie przechwytuje at się takich wyjątków. wyk4.dzielenieprzezzero.main(dzielenieprzezzero.java:17) Co się wtedy dzieje z takim wyjątkiem? Przedostaje się przez wszystkie wywołania na zewnątrz (jak każdy inny wyjątek) aż trafi do metody main(). Jeśli tam też nie zostanie złapany, to przed wyjściem z programu wywoływana jest dla niego metoda printstacktrace(); Jeśli zobaczymy taki wyjątek, to zwykle znaczy, że musimy coś poprawić w naszym kodzie. 44/116

Podsumujmy... Error Błąd maszyny wirtualnej Javy, pojawia się automatycznie Zwykle: nic nie możemy poradzić, więc nic nie robimy RuntimeException Wyjątek obsługiwany przez Javę (automatycznie rzucany i przekazywany) Zwykle: wynika z naszego błędu, więc musimy odpowiednio poprawić kod Pozostałe Exception Sami musimy zajć się zgłaszaniem i łapaniem odpowiednich wyjątków (wczytywanie plików, bazy danych ) 45/116

Co ciekawego siedzi w obiekcie wyjątku? Wiemy już, że jest tam m.in.. printstacktrace() - czyli mamy dostęp do informacji skąd dokładnie pochodzi nasz wyjątek. Warto wiedzieć, że możemy przenosić w wyjątku także wiadomość / tekst: Jeśli w konstruktorze wyjątku ustawimy wiadomość: if(mianownik==0) throw new ArithmeticException("Mianownik = 0"); To taką wiadomość możemy potem odczytać w miejscu obsługującym wyjątek: catch( ArithmeticException IndexOutOfBoundsException e) { System.out.println(e.getMessage()+". Podaj inną liczbę."); Na ekranie pojawi się: Mianownik =0. Podaj inną liczbę. 46/116

Tworzenie własnych wyjątków Java posiada wbudowane wyjątki obsługujące najczęściej spotykane błędy. Jednak często zachodzi potrzeba zdefiniowania nowych wyjątków specyficznych dla naszego programu. Aby utworzyć nową klasę wyjątku należy zdefiniować klasę dziedziczącą po klasie Exception. Nowo zdefiniowana klasa nie musi nawet niczego implementować. Najczęściej implementowane zmiany w klasach nowych wyjątków, to: - dodatkowe zmienne instancyjne przechowujące stan sytuacji błędnej - pokrywanie standardowych metod klasy Throwable takich, jak: getlocalizedmessage(), getmessage(), printstacktrace() i tostring() 47/116

Przykład: WlasnyWyjatek.java //deklaracja klasy wlasnego wyjatku class LiczbaNieparzystaException extends Exception{ int n; LiczbaNieparzystaException(int liczba){ n = liczba; public String tostring(){ return "Wyjątek! Liczba " + n + " jest nieparzysta"; 48/116

Przykład: WlasnyWyjatek.java //deklaracja klasy wlasnego wyjatku class LiczbaNieparzystaException extends Exception{ int n; LiczbaNieparzystaException(int liczba){ n = liczba; public String tostring(){ return "Wyjątek! Liczba " + n + " jest nieparzysta"; public class WlasnyWyjatek { //deklaracja metody zglaszajacej wyjatek static void sprawdzparzystosc(int liczba) throws LiczbaNieparzystaException{ if (liczba %2!= 0 ) throw new LiczbaNieparzystaException(liczba); public static void main(string[] args) { for (int i = 1; i<10; i++){ try { sprawdzparzystosc(i); catch (LiczbaNieparzystaException e) { System.out.println(e); 49/116

Tworzenie własnych wyjątków public class WlasnyWyjatek { //deklaracja metody zglaszajacej wyjatek static void sprawdzparzystosc(int liczba) throws LiczbaNieparzystaException{ if (liczba %2!= 0 ) throw new LiczbaNieparzystaException(liczba); public static void main(string[] args) throws LiczbaNieparzystaException { for (int i = 1; i<10; i++){ sprawdzparzystosc(i); W tym przykładzie, w przypadku wystąpienia wyjątku w metodzie sprawdzparzystosc() zostanie on przekazany do metody main(), a co za tym idzie obsługa będzie przez JVM (koniec programu) 50/116

Podsumowanie Wyjątek w Java jest obiektem, który opisuje sytuację błędną powstałą w kodzie. Zaistnienie sytuacji błędnej w metodzie powoduje utworzenie obiektu reprezentującego wyjątek i zgłoszenie go przez metodę, w której błąd wystąpił. Następnie metoda może sama obsłużyć wyjątek lub przesłać go do obsługi przez inne metody/obiekty. Wyjątki mogą być zgłaszane przez maszynę wirtualną Javy lub przez kod użytkownika. Wyjątki zgłaszane przez maszynę wirtualną są związane z tzw. błędami fatalnymi, natomiast zgłaszane przez użytkownika z błędami związanymi z logiką programu. Składnia programu obsługującego wyjątki bazuje na pięciu słowach kluczowych: try, catch, throw, throws i finally. 51/116

Instrukcja throw Służy do zgłaszania wyjątków przez nasz program: throw WYJĄTEK; Wykonanie komendy throw powoduje natychmiastowe przerwanie sekwencyjnego wykonania programu. Wykonanie programu przenosi się do najbliższej sekcji obsługi zgłoszonego wyjątku. Jeżeli takiej sekcji nie ma, to program zostanie zatrzymany, a domyślny program obsługi wypisze ścieżkę wywołań metod aż do zgłoszonego wyjątku. public void sety(double y) { if (y < YMIN x > YMAX) throw new IllegalArgumentException(); this.y = y; 52/116

Obsługa wyjątków: try - catch W przypadku wystąpienia nieobsługiwanego wyjątku program kończy pracę. Aby samemu obsłużyć błąd powodujący przerwanie programu należy umieścić go w bloku try {, a następnie w bloku catch{ umieścić typy wyjątków, na które chcemy reagować oraz związać z nimi kod obsługujący zgłoszony wyjątek. Należy również pamiętać, że po obsłudze wyjątku przez blok try/catch program nie wraca do komendy następnej w bloku try lecz przechodzi do wykonania pierwszej instrukcji za blokiem try/catch. 53/116

Na te nic nie możemy poradzić... Mogą was spotkać przez przypadek... Operacje na plikach Operacje na bazach danych Wyjątki powrócą! 54/116

QUIZ 55/116

Pytanie 1 Jaka jest różnica między słowami kluczowymi throw a throws? 56/116

Pytanie 1 Jaka jest różnica między słowami kluczowymi throw a throws? (a) Słowo throw służy do zgłoszenia wyjątku, słowo throws oznacza, że dana metoda nie obsługuje wyjątku, ale może go zgłosić (b) Żadna, można je stosować naprzemiennie (c) throws należy użyć jeśli podmiotem jest trzecia osoba liczby pojedynczej, w przeciwnym wypadku używamy throw 57/116

Pytanie 1 Jaka jest różnica między słowami kluczowymi throw a throws? (a) Słowo throw służy do zgłoszenia wyjątku, słowo throws oznacza, że dana metoda nie obsługuje wyjątku, ale może go zgłosić static void je Funkcja() throws ArithmeticException (b)public Żadna, można stosować naprzemiennie { (c)...throws należy użyć jeśli podmiotem jest trzecia osoba if(mianownik==0) throw new ArithmeticException(); liczby pojedynczej, w przeciwnym wypadku używamy... throw 58/116

Pytanie 2 Czym się różni Exception od Error? (a) Oba to wyjątki, ale Exception można opanować, a Error to błąd którego aplikacja nie będzie w stanie rozwiązać (b) Exception można przechwytywać, Error nie należy (c) Oba powyższe 59/116

Pytanie 2 Czym się różni Exception od Error? (a) Oba to wyjątki, ale Exception można opanować, a Error to błąd którego aplikacja nie będzie w stanie rozwiązać (b) Exception można przechwytywać, Error nie należy (c) Oba powyższe 60/116

Pytanie 3 Wyjątki są... (a) Obiektami, które opisują błędną sytuację w kodzie (b) Podklasami klasy Throwable (c) Związane ze słowami kluczowymi: try, catch, finally, throw, throws 61/116

Pytanie 3 Wyjątki są... (a) Obiektami, które opisują błędną sytuację w kodzie (b) Podklasami klasy Throwable (c) Związane ze słowami kluczowymi: try, catch, finally, throw, throws (d) Wszystkie powyższe 62/116

Swing JComponent (settooltoptext, setborder) LookAndFeel 64/116

Ogólny schemat dodawania i obsługi zdarzeń komponentów deklaracja zmiennej (Klasa obiekt;) tworzenie nowego obiektu (obiekt = new Klasa(parametry_kons); ) ustawianie właściwości komponentu (preferowany rozmiar, tekst, kolor...) dodawanie interfejsu (nasłuchu) do obiektu: obiekt.addnazwainterfejsu(obiekt_implemetujący_interfejs); dodawanie obiektu do okna lub np. panelu : add(obiekt), panel.add(obiekt),... odpowiednia modyfikacja metody obsługującej zdarzenia generowane przez obiekt w obiekcie_implenetującym_interfejs

Importowanie projektu do Eclipse: File Export General Archive File Import Export General Archive File General Existing Projects into Workspace Export General Archive File archive file: Przykłady do ściągnięcia ze strony należy zaimportować w ten sposób http://realsearchgroup.org/sematerials/tutorials/import_export/index.html#section2_0

JComponent Wszystkie komponenty Swing których nazwy zaczynają się od J są pochodnymi klasy JComponent. Wybrane metody: paintcomponent() - rysowanie na komponencie, settooltiptext() - ustawienie dymku podpowiedzi, setborder() - ustawienie obramowania, - metody używane przez zarządców układu (layout managers) metody getpreferredsize, getaligmentx, getminimumsize, getmaximumsize Każdy komponent ma odpowiadający obiekt ComponentUI, który przeprowadza rysowanie, przechwytywanie zdarzeń, ustalanie rozmiaru, itd. jest on zależny od bieżącego wyglądu interfejsu, który ustawiamy poleceniem UIManager.setLookAndFeel(...) 67/116

settooltiptext() - przykład ToolTipTextDemo.java 68/116

setborder() - przykład BorderDemo.java JPanel panele[] = new JPanel[9]; for (int i = 0; i<9; i++){ panele[i] = new JPanel (); panele[i].setborder(borderfactory.createlineborder(new Color(i*1,i*20,i*10))); add(panele[i]); 69/116

setborder() - przykład Więcej typów ramek w dokumentacji: http://docs.oracle.com/javase/tutorial/uiswing/components/border.html 70/116

Look And Feel Look and Feel przy projektowaniu GUI to jest zespół cech związanych z wyglądem (look) kolorami, kształtami, jak również zachowaniem (feel) komponentów Zwykle każdy system operacyjny ma własny LookAndFeel (np. wszystkie okienka aplikacji na windowsie wyglądają podobnie), istnieją też LookAndFeel dostępne na wszystkich platformach. 71/116

Look And Feel Jak ustawić konkretny wygląd? UIManager.setLookAndFeel (nazwa look-and-feel) Jak sprawdzić jakie są dostępne na naszym systemie? final UIManager.LookAndFeelInfo[] installedlf = UIManager.getInstalledLookAndFeels(); LookAndFeelChooser.java 72/116

Tworzenie GUI Layout Wybrane kontrolki: JMenu Okna dialogowe JColorChooser inne 73/116

JMenu https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html 74/116

JMenu jak działa? Niezbędne elementy: JMenuBar pasek menu ustawiany dla JFrame JMenu pojedynczy wybór z paska menu (np. Plik, Edycja ) - dodawany do JMenuBar JMenuItem element na rozwijanej liście menu dodawany do JMenu http://thaicreate.com/ 75/116

JMenu jak działa? Niezbędne elementy: JMenuBar pasek menu ustawiany dla JFrame JMenu pojedynczy wybór z paska menu (np. Plik, Edycja ) - dodawany do JMenuBar JMenuItem element na rozwijanej liście menu dodawany do Jmenu Żeby zrobić kolejne pod-menu wystarczy dodać nowy JMenu do już istniejącego. 76/116

JMenu jak działa? Niezbędne elementy: JMenuBar pasek menu ustawiany dla JFrame: JMenuBar menubar = new JMenuBar(); frame.setjmenubar(menubar); JMenu pojedynczy wybór z paska menu (np. Plik, Edycja ) - dodawany do JMenuBar JMenu menu = new JMenu("Menu"); menubar.add(menu); JMenuItem element na rozwijanej liście menu dodawany do JMenu JMenuItem menuitem1 = new JMenuItem("Item 1"); menu.add(menuitem1); Żeby zrobić kolejne pod-menu wystarczy dodać nowy JMenu do już istniejącego. JMenu submenu = new Jmenu( Sub Menu"); JMenuItem menuitem4 = new JmenuItem("Item 4"); submenu.add(menuitem4); menu.add(submenu); 77/116

Tworzenie GUI JMenu [przykład] 78/116

JMenu menuitem = new JMenuItem("Both text and icon", new ImageIcon("images/middle.gif")); menu.setmnemonic(keyevent.vk_n); JRadioButtonMenuItem JCheckBoxMenuItem menuitem.setaccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK)); https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html 79/116

public class MenuWindow extends JFrame { MenuWindow() { super("okno z menu"); setdefaultcloseoperation(exit_on_close); setsize(800,800); Więcej: JMenuDemo.java JMenuDemo2.java JMenuBar menubar = new JMenuBar(); JMenu plik = new JMenu("File"); JMenu submenu = new JMenu("A submenu"); JMenuItem menuitem = new JMenuItem("An item in the submenu"); menuitem.setaccelerator(keystroke.getkeystroke( KeyEvent.VK_2, ActionEvent.ALT_MASK)); submenu.add(menuitem); plik.add(submenu); plik.addseparator(); JMenuItem exit = new JMenuItem("Exit"); exit.addactionlistener(new ActionListener(){ @Override public void actionperformed(actionevent arg0) { System.exit(0); ); plik.add(exit); menubar.add(plik); this.setjmenubar(menubar); public static void main(string[] args) { MenuWindow frame = new MenuWindow(); frame.setvisible(true); 80/116

Okno dialogowe https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html 81/116

Okno dialogowe https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html 82/116

Okno dialogowe JOptionPane.showMessageDialog(null, "Eggs aren t supposed to be green."); 83/116

Okno dialogowe JOptionPane.showMessageDialog(null, "Eggs aren t supposed to be green."); JOptionPane.showMessageDialog(frame, "Eggs aren t supposed to be green.","inane error",joptionpane.error_message); 84/116

Okno dialogowe showmessagedialog(component parentcomponent, Object message, String title, int messagetype, Icon icon) Tytuł okienka Informacja w okienku JOptionPane.showMessageDialog(frame, "Eggs aren t supposed to be green.","inane error",joptionpane.error_message); null jeśli okienko ma się pojawić po środku ekranu Referencja do JFrame jeśli okienko ma się pojawić na środku okna programu Ikonka QUESTION_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE ERROR_MESSAGE 85/116

Tworzenie GUI JOptionPane [przykład] 86/116

Okno dialogowe Więcej: JOptionPaneDemo.java 87/116

Tworzenie GUI JEditorPane [przykład] 88/116

JColorChooser JColorChooser pozwala wybrać kolor z palety kolorów. Wyskakujące okienko dialogowe z paletą kolorów: Color newcolor = JColorChooser.showDialog( null, "Choose Color", texteditor.getforeground()); https://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html 89/116

JColorChooser Można też wstawić sobie paletę bezpośrednio do okienka lub panelu: protected JColorChooser tcc; public ColorChooserDemo() { super(new BorderLayout()); tcc = new JColorChooser(kolorStartowy); tcc.getselectionmodel().addchangelistener(this); tcc.setborder(borderfactory.createtitledborder( "Choose Text Color")); add(tcc, BorderLayout.PAGE_END); public void statechanged(changeevent e) { Color newcolor = tcc.getcolor(); Więcej: ColorChooserDemo.java https://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html 90/116

Tworzenie GUI Przykłady wybranych implementacji 91/116

JTextFieldDemo.java JTextField JTextField JTextField JTextField pole1 pole2 pole3 pole4 = = = = new new new new I JTextField( wpisz cos i wcisnij Enter"); JTextField(20); JTextField("zmien ten tekst"); JTextField(20); pole1.addactionlistener(pole1listener); pole3.addkeylistener(pole3listener); add(pole1); add(pole2); add(pole3); add(pole4); 92/116

JTextFieldDemo.java II ActionListener pole1listener = new ActionListener() { public void actionperformed(actionevent e) { pole2.settext( pole1.gettext()) ; Action: ; naciśnięcie enter po wpisaniu tekstu KeyListener pole3listener = new KeyListener() { @Override public void keytyped(keyevent e) { @Override public void keyreleased(keyevent e) { pole4.settext( pole3.gettext()) ; Key listener: @Override Metoda keyreleased odpali się public void keypressed(keyevent e) { po puszczeniu danego klawisza ; keypressed - when the key goes down keyreleased - when the key comes up Programowanie Obiektowe (Wykład) keytyped - when the unicode character represented by this key is sent by the keyboard to system input. 93/116

JTextFieldDemo.java III kontrolka.setfocusable(true); // Jesli nie wszystkie metody z KeyListener sa wykorzystane // bardziej przejrzystej jest korzystanie z KeyAdaptera // implementujacego wybrane metody: KeyListener pole3adapter = new KeyAdapter() { public void keyreleased(keyevent e) { pole4.settext( pole3.gettext()) ; Ważne! ; Jeśli nie potrzebujemy wszystkich metod danego listenera, to wystarczy użyć Adapter Inne przykłady adapterów: MouseAdapter (zamiast MouseListener) MouseMotionAdapter (zamiast MouseMotionListener) WindowAdapter (zamiast WindowListener) 94/116

JCheckBoxDemo.java JCheckBox cb1 = new JCheckBox("Pole wyboru 1"); JCheckBox cb2 = new JCheckBox("Pole wyboru 2"); JCheckBox cb3 = new JCheckBox("Pole wyboru 3"); cb1.addactionlistener(cblistener); cb2.addactionlistener(cblistener); cb3.addactionlistener(cblistener); Panel panelcheckbox = new JPanel(); panelcheckbox.setlayout(new FlowLayout(FlowLayout.LEFT)); panelcheckbox.add(cb1); panelcheckbox.add(cb2); panelcheckbox.add(cb3); 95/116

JCheckBoxDemo.java ActionListener cblistener = new ActionListener() { public void actionperformed(actionevent e) { Object obj = e.getsource(); Ważna metoda: isselected() if (obj == cb1) if (cb1.isselected()) t.append("pole 1 ustawione\n"); else t.append("pole 1 wyczyszczone\n"); if (obj == cb2) if (cb2.isselected()) t.append("pole 2 ustawione\n"); else t.append("pole 2 wyczyszczone\n"); if (obj == cb3) if (cb3.isselected()) t.append("pole 3 ustawione\n"); else t.append("pole 3 wyczyszczone\n"); ; Przykład obsługi kilku CheckBox ów w jednym interfejsie 96/116

JCheckBoxDemo.java ActionListener cblistener = new ActionListener() { public void actionperformed(actionevent e) { Object obj = e.getsource(); Ważne! if (obj == cb1) Możemy wyciągnąć obiekt który if (cb1.isselected()) t.append("pole 1 ustawione\n"); został naciśnięty else t.append("pole 1 wyczyszczone\n"); z obiektu danego zdarzenia if (obj == cb2) if (cb2.isselected()) t.append("pole 2 ustawione\n"); else t.append("pole 2 wyczyszczone\n"); if (obj == cb3) if (cb3.isselected()) t.append("pole 3 ustawione\n"); else t.append("pole 3 wyczyszczone\n"); ; Przykład obsługi kilku CheckBox ów w jednym interfejsie 97/116

JRadioButtonDemo.java ButtonGroup grupa = new ButtonGroup(); JRadioButton rb1 = new JRadioButton("jeden", false), rb2 = new JRadioButton("dwa", false), rb3 = new JRadioButton("trzy", false); // Grupowanie obektow JRadioButton do ButtonGroup //- tylko jeden moze byc zaznaczony grupa.add(rb1); grupa.add(rb2); grupa.add(rb3); rb1.addactionlistener(listener); rb2.addactionlistener(listener); rb3.addactionlistener(listener); add(rb1); add(rb2); add(rb3); ActionListener listener = new ActionListener() { public void actionperformed(actionevent e) { etykieta.settext("przycisk wyboru " + ((JRadioButton)e.getSource()).getText()); ; 98/116

JComboBoxDemo.java String[] description = { "Bialy", "Zolty", "Czerwony", "Niebieski", ; JTextField poletekstowe = new JTextField("Wpisz nazwe nowej pozycji"); JComboBox combobox = new JComboBox(description); JButton przycisk = new JButton("Dodaj pozycje"); JLabel etykieta = new JLabel(); 99/116

JComboBoxDemo.java String[] description = { "Bialy", "Zolty", "Czerwony", "Niebieski", ; JTextField poletekstowe = new JTextField("Wpisz nazwe nowej pozycji"); JComboBox combobox = new JComboBox(description); JButton przycisk = new JButton("Dodaj pozycje"); JLabel etykieta = new JLabel(); combobox.addactionlistener(new ActionListener() { public void actionperformed(actionevent e){ etykieta.settext("indeks: "+ combobox.getselectedindex() + " " + combobox.getselecteditem()); if (combobox.getselecteditem().equals("bialy")) etykieta.settext("wybrano kolor Bialy"); add(combobox); 100/116

JComboBoxDemo.java String[] description = { "Bialy", "Zolty", "Czerwony", "Niebieski", ; JTextField poletekstowe = new JTextField("Wpisz nazwe nowej pozycji"); JComboBox combobox = new JComboBox(description); JButton przycisk = new JButton("Dodaj pozycje"); JLabel etykieta = new JLabel(); combobox.addactionlistener(new ActionListener() { public void actionperformed(actionevent e){ etykieta.settext("indeks: "+ combobox.getselectedindex() + " " + combobox.getselecteditem()); if (combobox.getselecteditem().equals("bialy")) etykieta.settext("wybrano kolor Bialy"); add(combobox); przycisk.addactionlistener(new ActionListener() { public void actionperformed(actionevent e){ if (poletekstowe.gettext()!= "") combobox.additem(poletekstowe.gettext()); etykieta.settext("dodano: " + poletekstowe.gettext()); ); 101/116

JSliderDemo.java JSlider redslider,greenslider,blueslider; redslider = new JSlider(); redslider.setminimum(0); redslider.setmaximum(255); redslider.setvalue(127); greenslider = new JSlider(0,255,127); blueslider = new JSlider(JSlider.HORIZONTAL, 0, 255, 127); redslider.addchangelistener(sliderslistener); greenslider.addchangelistener(sliderslistener); blueslider.addchangelistener(sliderslistener); add(new JLabel("Red:")); add(redslider); add(new JLabel("Green:")); add(greenslider); add(new JLabel("Blue:")); add(blueslider); 102/116

JSliderDemo.java JPanel panel = new JPanel(); ChangeListener sliderslistener = new ChangeListener() { @Override public void statechanged(changeevent e) { int red = redslider.getvalue(); int green = greenslider.getvalue(); int blue = blueslider.getvalue(); panel.setbackground(new Color(red, green, blue)); ; 103/116

JTabbedPaneDemo.java JTabbedPane tabbedpane = new JTabbedPane(); JPanel panel1 = new JPanel(new FlowLayout()); JPanel panel2 = new JPanel(new FlowLayout()); JPanel panel3 = new JPanel(new FlowLayout()); tabbedpane.addtab("tytul 1", panel1); tabbedpane.addtab("tytul 2", panel2); tabbedpane.addtab("tytul 3", panel3); add(tabbedpane); // tabbedpane.remove(panel2); 104/116

JEditorPaneDemo.java JEditorPane edytor = new JEditorPane(); edytor.seteditable(false); try { URL link = new URL("http://jakasstrona.html"); edytor.setpage(link); Poprawnie wyświetli tylko najprostrze strony. catch(ioexception e) { edytor.settext("wyjatek:"+e); add(new JScrollPane(edytor)); 105/116

JListDemo.java String[] nazwydruzyn = { "Legia Warszawa", "Lech Poznan", "Polonia Warszawa", "Slask Wroclaw", "Gornik Zabrze", "Lechia Gdansk", "Zaglebie Lubin", "Piast Gliwice", "Wisla Krakow", "Jagiellonia Bialystok", "Korona Kielce", "Widzew Lodz", "Pogon Szczecin", "Ruch Chorzow", "Podbeskidzie Bielsko-Biala", "GKS Belchatow"; DefaultListModel listaelementy = new DefaultListModel(); JList lista = new JList(listaElementy); for (int i=0; i < nazwydruzyn.length; i++) listaelementy.addelement(nazwydruzyn[i]); lista.addlistselectionlistener(listalistener); lista.setvisiblerowcount(5); //Dodawanie JScrollPane: JScrollPane listscrollpane = new JScrollPane(lista); listscrollpane.setpreferredsize( new Dimension(300,100)); //add(lista, BorderLayout.CENTER); add(listscrollpane, BorderLayout.CENTER); 106/116

JListDemo.java ListSelectionListener listalistener = new ListSelectionListener() { public void valuechanged(listselectionevent e) { if (e.getvalueisadjusting()) return; System.out.println("Zaznaczone elementy listy:"); for (Object wybrane : lista.getselectedvalueslist()) System.out.println(wybrane); ; 107/116

JListDemo.java JButton usunelementy = new JButton("Usun wybrane elementy"); JTextField poledodawania = new JTextField("Wpisz nowy element i wcisnij ENTER"); usunelementy.addactionlistener(usuwanieelementow); poledodawania.addactionlistener(dodawanieelementow); ActionListener usuwanieelementow = new ActionListener() { @Override public void actionperformed(actionevent e) { for (Object wybrane : lista.getselectedvalueslist()) listaelementy.removeelement(wybrane); ; ActionListener dodawanieelementow = new ActionListener() { @Override public void actionperformed(actionevent e) { listaelementy.addelement(poledodawania.gettext()); ; 108/116

Rysowanie PaintComponent i MouseMotionListener 109/116

Rysowanie.java Każdy komponent posiada metodę paintcomponent(graphics g), którą można zmodyfikować w klasach pochodnych, np.: class MyPanel extends JPanel { private int squarex = 10; private int squarey = 20; private int squarew = 100; private int squareh = 100; protected void paintcomponent(graphics g) { super.paintcomponent(g); g.setcolor(color.yellow); g.fillrect(squarex,squarey,squarew,squareh); g.setcolor(color.black); g.drawrect(squarex,squarey,squarew,squareh);

RysowanieMysz.java Dodając do tak stworzonego panelu interfejs obsługi zdarzeń myszy można rysować prostokąty o rozmiarach definiowanych myszą public MyPanel() { addmouselistener(new MouseAdapter() { public void mousepressed(mouseevent e) { squarex = e.getx(); squarey = e.gety(); repaint(); 111/116

RysowanieMysz.java Dodając obsługę puszczenia klawisza myszy można definiować rozmiar komponentu: addmouselistener(new MouseAdapter() { public void mousepressed(mouseevent e) { squarex = e.getx(); squarey = e.gety(); public void mousereleased(mouseevent e) { if (e.getx() > squarex) squarew = e.getx() - squarex; else { squarew = squarex - e.getx(); squarex = e.getx(); if (e.gety() > squarey) squareh = e.gety() - squarey; else { squareh = squarey - e.gety(); squarey = e.gety(); repaint(); );

RysowanieMysz2.java Tak utworzony panel z opcją rysowania przy pomocy myszy jest traktowany jak każdy inny komponent Swing, może być wielokrotnie wykorzystany:

RysowanieMysz2.java JFrame f = new JFrame("Kilka obiektow MyPanel() wyswietlanych jednoczesnie"); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new GridLayout(3,3,10,10)); MyPanel[] panele = new MyPanel[9]; for (int i=0; i<9; i++){ panele[i] = new MyPanel(); panele[i].setbackground(new Color(i*12)); f.add(panele[i]); f.pack();

RysowanieMysz3.java Poprzedni przykład można zmodyfikować tak, aby rysowane było kilka elementów, których współrzędne są przechowywane w tablicach: class MyPanel3 extends JPanel { private int MAKSYMALNA_LICZBA_ELEMENTOW = 5; private int[] x = new int [MAKSYMALNA_LICZBA_ELEMENTOW]; private int[] y = new int [MAKSYMALNA_LICZBA_ELEMENTOW]; private int licznikklikniec = 0; // (... konstrukor i inne metody...) protected void paintcomponent(graphics g) { super.paintcomponent(g); for (int i = 0; i<licznikklikniec; i++){ g.filloval(x[i], y[i], 40, 40); g.drawstring(""+i, x[i], y[i]);

RysowanieMysz3.java Poprzedni przykład można zmodyfikować tak, aby rysowane było kilka elementów, których współrzędne są przechowywane w tablicach: public MyPanel3() { addmouselistener(new MouseAdapter() { public void mousepressed(mouseevent e) { if (licznikklikniec < MAKSYMALNA_LICZBA_ELEMENTOW){ x[licznikklikniec] = e.getx(); y[licznikklikniec] = e.gety(); licznikklikniec++; repaint(); else{ //Przekroczona dopuszczalna ilosc klikniec.. if (e.getbutton() == MouseEvent.BUTTON3) wyczyscelementy(); //obsluga prawego klawisza myszy );

RysowanieMysz3.java

Ciekawostki GlassPane 118/116

119/116

Dziękuję za Uwagę! Do zobaczenia za tydzień. Będziemy mówić o plikach i strumieniach + Ładowanie zewnętrznych bibliotek oraz rysowanie wykresów 120/116