Komponenty AWT _ AWT (ang. AbstractWindowing Toolkit) - zbiór klas, które zapewniaja tworzenie prostych elementów graficznego interfejsu u'ytkownika GUI ( ang.Graphical User Interface); _ wiekszosc tych klas znajduje sie w pakiecie java.awt _ wszystkie komponenty wywodza sie z klasy Component, która definiuje metody m.in. ustalajace własciwosci komponentów _ rodzaje komponentów: komponenty-kontenery (moga zawierac inne komponenty) i komponenty terminalne (nie moga zawierac innych komponentów) Hierarchia klas AWT … Wspólne własciwosci komponentów _ rozmiar (Size) _ poło'enie (Location) _ rozmiar i poło'enie (Bounds) _ pismo (Font) _ kolor tła (Background) _ kolor pierwszoplanowy (Foreground) _ rodzic (Parent) _ nazwa (Name) _ własciwosci typu 0-1: widzialnosc (Visible) dostepnosc (Enabled) Ustalanie własciwosci komponentów _ własciwosci moga byc pobierane za pomoca metod getNazwa() isNazwa() //dla własciwosci 0-1 typu boolean _ ustalane sa za pomoca metod setNazwa(...) _ na przykład: frame.getSize(); frame.setSize(200,200); Obiekt klasy Font _ pismo - obiekt klasy Font tworzony za pomoca konstruktora font(nazwa_pisma, styl, rozmiar); nazwa_pisma - łancuch znakowy okreslajacy rodzaj pisma (np."Dialog") styl - jedna ze stałych statycznych: Font.BOLD, Font.ITALIC, Font.PLAIN rozmiar - liczba całkowita okreslajaca rozmiar w punktach _ Przykład Button b= new Button ("Tekst na przycisku"); b.setFont(new Font("Dialog",Font.PLAIN,14)); Obiekt klasy Color _ kolor - obiekt klasy Color, kilka konstruktorów, stałe statyczne predefiniowanych kolorów np. Color.red, Color.blue, Color.white _ ustalanie koloru np. przycisku b za pomoca predefiniowanych stałych: b.setBackground(Color.blue); b.setForeground(Color.white); _ ustalanie dowolnego koloru obiektu ob: int r, g, b; r=200; g=200; b=255; ob.setBackground(new Color(r,g,b)); Blokowanie i uwidacznianie komponentu _ komponenty gotowe do interakcji sa odblokowane (ang. enabled); zablokowanie komponentu uniemo'liwia interakcje z nim np. b.setEnabled(false);//zablokowanie, klikniecia //przycisku nie beda przyjmowane //odblokowanie: if (!b.isEnabled()) b.setEnabled(true); _ wszystkie komponenty (oprócz wywodzacych sie z klasy Window) sa domyslnie widoczne; w trakcie działania programu mo'na je czynic niewidzialnymi np.: Button b=new Button(...); b.setVisible(false); //b stanie sie niewidoczny if (!b.isVisible()) b.setVisible(true); //uwidaczniamy Okna - podstawowe pojecia _ okno wtórne (ang. secondary window) - okno, które ma własciciela - inne okno _ okno pierwotne (ang. owner) - własciciel innych okien _ wszystkie okna pochodza od klasy Window Rodzaje okien (Window): _ Frame - mo'e zawierac pasek tytułu, ikony sterujace, ewentualnie pasek menu; główne okno aplikacji jest zawsze obiektem klasy pochodnej od Frame _ Dialog - okno z ramka i tytułem, nie mo'e miec paska menu Rodzaje okien _ Dialog _ Frame Komponenty - przykład 1 import java.applet.*; import java.awt.*; public class etykieta extendsApplet{ public void init(){ add(new Label("Etykieta (Label)")); List l=new List(3,true); l.add("Element listy (List) 1");l.add("Element listy (List) 2"); l.add("Element listy (List) 3");l.add("Element listy (List) 4"); TextField t=newTextField("Pole edycyjne (TextField)",20); Button b=new Button("Przycisk (Button)"); Choice ch=new Choice(); ch.add("Wybor 1 (Choice)"); add(t); add(l); add(b); add(ch); add(new Checkbox("Znacznik (Checkbox)",true)); } } Komponenty - przykład 2 import java.applet.*; import java.awt.*; public class fonty extendsApplet{ public void init(){ Font f=new Font("Dialog",Font.BOLD,18); //ustalenie fontu Label l=new Label("Zmiany kolorów i fontów komponentów"); TextField t=newTextField("Pole tekstowe",10); Button b=new Button("Przycisk"); l.setFont(f); l.setBackground(Color.red); t.setFont(f); t.setForeground(Color.blue); b.setFont(f); b.setBackground(Color.black); b.setForeground(Color.yellow); add(l); add(t); add(b); } } Kontenery _ kontenery - komponenty, które moga zawierac inne komponenty (lub inne kontenery) _ dodawanie komponentów do kontenerów: kontener.add(komponent); _ usuniecie komponentu z kontenera: kontener.remove(komponent); _ najprostsze kontenery - klasy Panel - słu'a do grupowania elementów; panele sa umieszczane w innych kontenerach - typu Window (Frame, Dialog). Domyslnie Panel jest widoczny, a Window nie. Dlatego uwidocznienie Frame i Dialog wymaga metody setVisible(true); frame.setVisible(true); Kontenery - rozkłady _ z ka'dym kontenerem skojarzony jest tzw. Zarzadca rozkładu (klasa LayoutManager), który okresla rozmiary i poło'enie komponentów przy wykreslaniu kontenera _ w klasie ka'dego z komponentów znajduja sie metody: getPrefferedSize(), getMinimumSize(), getMaximumSize(), zwracajace odpowiednie rozmiary (obiekty typu Dimension z publicznymi polami width i height); rozmiary te sa brane pod uwage przy układaniu komponentów _ najpopularniejsze rozkłady: FlowLayout, BorderLayout, GridLayout Rozkłady - charakterystyka _ FlowLayout - domyslny dla Panel, komponenty uło'one w wierszu, mo'na ustalic wyrównanie komponentów (FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER) _ BorderLayout - domyslny dla Frame i Dialog, komponenty uło'one sa "geograficznie": "North", "East", "South", "West", "Center"; w celu dodania komponentu u'ywa sie metody: kontener.add(komponent,"miejsce"); _ GridLayout - tablica komponentów, rozmiary wszystkich komponentów beda takie same, do ustalenia wymiarów tablicy stosuje sie konstruktor: GridLayout(n,m) //tablica n x m komponentów Rozkłady - przykład 1 import java.awt.*; import java.applet.*; public class rozkl extendsApplet { static int ile=5; public void init() { Color kolor=new Color(255,255,140); Frame fr=new Frame("Przykłady rozkładów"); //utworzenie ramki fr fr.setLayout(new GridLayout(3,1)); //ustalenie rozkładu ramki fr Panel p=new Panel(); //utworzenie panela p p.setLayout(new FlowLayout()); //ustalenie rozkładu panela p p.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p.add(b); } ... Rozkłady - przykład 1 c.d. ... Panel pl=new Panel(); //utworzenie kolejnego panela pl pl.setLayout(new BorderLayout());// ustalenie rozkładu Label lab=new Label ("Flow Layout");//utworzenie etykiety lab.setFont(new Font("Dialog",Font.BOLD,16)); lab.setBackground(kolor); pl.add(lab,"North"); //dodanie etykiety do panela na pozycji North pl.add(p,"Center"); //dodanie panela p do panela pl na pozycji Center fr.add(pl); //dodanie panela pl do ramki fr fr.pack(); //dopasowanie wymiarów okna do komponentów fr.setVisible(true); //uwidocznienie ramki } } Rozkłady - przykład 2 import java.awt.*; import java.applet.*; public class Rozklad2 extendsApplet { static int ile=5; public void init() { Color kolor=new Color(255,255,140); Frame fr=new Frame("Przykłady rozkładów"); //utworzenie ramki fr fr.setLayout(new GridLayout(3,3)); //ustalenie rozkładu ramki fr Panel pg1=new Panel(); pg1.setLayout(new BorderLayout()); pg1.add("North", new Label("Flow layout:")); Panel p1=new Panel(); //utworzenie panela p p1.setLayout(new FlowLayout()); //ustalenie rozkładu panela p … Rozkłady - przykład 2 c.d. p1.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p1.add(b); } pg1.add("Center", p1); Panel pg2=new Panel(); pg2.setLayout(new BorderLayout()); pg2.add("North", new Label("Flow (left aligned):")); Panel p2=new Panel(); //utworzenie panela p p2.setLayout(new FlowLayout(FlowLayout.LEFT)); //ustalenie rozkładu panela p p2.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ …. Rozkłady - przykład 2 c.d. for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p2.add(b); } pg2.add("Center",p2); Panel pg3=new Panel(); pg3.setLayout(new BorderLayout()); pg3.add("North", new Label("Border Layout:")); Panel p3=new Panel(); //utworzenie panela p p3.setLayout(new BorderLayout()); //ustalenie rozkładu panela p p3.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p3.add(b); } Rozkłady - przykład 2 c.d. pg3.add("Center", p3); Panel pg4=new Panel(); pg4.setLayout(new BorderLayout()); pg4.add("North", new Label("Grid Layout (1,5):")); Panel p4=new Panel(); //utworzenie panela p p4.setLayout(new GridLayout(1,5)); //ustalenie rozkładu panela p p4.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p4.add(b); } pg4.add("Center", p4); Rozkłady - przykład 2 c.d. Panel pg5=new Panel(); pg5.setLayout(new GridLayout(5,1)); pg5.add("North", new Label("Grid Layout (5,1):")); Panel p5=new Panel(); //utworzenie panela p p5.setLayout(new BorderLayout()); //ustalenie rozkładu panela p p5.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p5.add(b); } pg5.add("Center", p5); Panel pg6=new Panel(); pg6.setLayout(new BorderLayout()); pg6.add("North", new Label("Grid Layout (2,3):")); Rozkłady - przykład 2 c.d. Panel p6=new Panel(); //utworzenie panela p p6.setLayout(new GridLayout(2,3)); //ustalenie rozkładu panela p p6.setBackground(kolor); //ustalenie tła panela p /* dodawanie komponentów - 5 przycisków do panela p:*/ for (int j=0;j<ile;j++) { Button b=new Button("Przycisk"+(j+1)); p6.add(b); } pg6.add("Center", p6); fr.add(pg1); //dodanie panela pgl do ramki fr fr.add(pg2); //dodanie panela pg2 do ramki fr fr.add(pg3); //dodanie panela pg3 do ramki fr fr.add(pg4); //dodanie panela pg4 do ramki fr fr.add(pg5); //dodanie panela pg5 do ramki fr fr.add(pg6); //dodanie panela pg6 do ramki fr fr.pack(); //dopasowanie wymiarów okna do komponentów fr.setVisible(true); //uwidocznienie ramki } } Obsługa baz danych przy u_yciu JDBC mgr Mariusz Kujawiak ODBC _ ODBC (Open DataBase Connectivity - otwarte łacze baz danych) - interfejs programowania baz danych opracowany w firmie Microsoft, który pozwala wszystkim aplikacjom Windows korzystajacym z baz danych za posrednictwem sieci posługiwac sie tym samym zbiorem wywołan _ W skład ODBC wchodza wywołania wbudowane w aplikacje oraz sterowniki ODBC Obsługa baz danych przy u_yciu JDBC 2 JDBC _ JDBC (Java DataBase Connectivity) - łacze do baz danych w jezyku Java _ interfejs programowania opracowany w 1996 r. przez Sun Microsystems, umo_liwiajacy niezale_nym od platformy aplikacjom napisanym w jezyku Java porozumiewac sie z bazami danych za pomoca jezyka SQL _ interfejs ten jest odpowiednikiem zaprojektowanego przez Microsoft łacza ODBC 3 Programowanie bazodanowe w Javie _ aplikacje bazodanowe programowane w tradycyjnych jezykach - zale_ne od architektury konkretnej bazy danych _ w Javie - niezale_nosc dzieki wprowadzeniu interfejsu JDBC, który operuje na poziomie jezyka SQL ukrywa przed programista specyficzne własnosci i ustawienia bazy danych _ program napisany w Javie - działa z dowolna baza danych obsługujaca ten sam standard SQL-a wspierajaca technologie JDBC _ Klasy i interfejsy JDBC - dostepne w pakiecie java.sql Obsługa baz danych przy u_yciu JDBC 4 Praca z baza danych poprzez JDBC _ załadowanie sterownika JDBC _ zdefiniowanie adresu URL połaczenia _ nawiazanie połaczenia _ utworzenie obiektu Statement _ wykonanie zapytania lub aktualizacja danych _ przetworzenie wyników _ zamkniecie połaczenia Sterowniki _ sterownik JDBC - zestaw klas implementujacych interfejsy JDBC dla okreslonej bazy danych _ zazwyczaj pisane przez producentów baz danych _ z jednej strony przyjmuja połaczenia JDBC i instrukcje, a z drugiej wysyłaja wywołania do bazy danych Kategorie sterowników 1. JDBC-ODBC bridge driver (technologia pomostowa miedzy JDBC a ODBC Microsoftu) 2. NativeAPI partly-Java driver (biblioteki napisane w innych jezykach) 3. JDBC-Net pure Java driver (standardowe interfejsy sieciowe) 4. Native-protocol pure Java driver (protokoły sieciowe wbudowane w maszyny bazodanowe) Kategorie sterowników _ Sterowniki typu 1 i 2 - czesto rozpowszechniane za darmo (np. w SDK) - wymagaja instalacji dodatkowego oprogramowania po stronie klienta _ Sterowniki typu 3 i 4 - zwykle odpłatne - nie wymagaja _adnych dodatkowych instalacji _ Aktualna lista dostepnych na rynku sterowników - na stronie java.sun.com Klasa DriverManager _ w celu nawiazania połaczenia z baza danych srodowisko wykonawcze Javy musi załadowac odpowiedni sterownik dla danej bazy _ za ładowanie i usuwanie z pamieci sterowników odpowiedzialna jest klasa DriverManager (zarzadca sterowników), która: dynamicznie zarzadza obiektami sterowników zachowujac kontekst zabezpieczen ka_dego sterownika kontekst zabezpieczen definiuje srodowisko, w jakim aplikacja jest uruchamiana porównuje kontekst zabezpieczen sterownika z kontekstem programu (sprawdza czy sa takie same)
Droga od kodu Javy do bazy danych _______ Baza danych DriverManager utrzymuje strukture danych zawierajaca obiekty Driver oraz informacje o nich } JDBC } Baza danych Ładowanie sterownika Przy pomocy wiersza polecen: _ _eby wykorzystac sterownik JDBC trzeba go załadowac _ nale_y okreslic sterownik do załadowania przy u_yciu zmiennej systemowej jdbc.drivers _ pomost JDBC-ODBC załaduje polecenie: java -Djdbc.drivers=sun.jdbc.JdbcOdbcDriver nazw_apl W programach (mniej elastyczne): _ u_ytkownik koncowy nie mo_e w prosty sposób zmienic wersji bazy danych _ łatwiejsze w codziennym u_ytkowaniu
Rejestracja sterownika
_ wywołanie metody Class.forName() _ argument metody (typu String) okresla sterownik, np. dla technologii pomostowej JDBC-ODBC jest to: "sun.jdbc.odbc.JdbcOdbcDriver" _ załadowanie sterownika - aby zapewnic elastycznosc kodu nale_y unikac podawania na stałe nazwy u_ywanej klasy sterownika, np. try { Class,forName("connect.microsoft.MicrosoftDriver"); Class.forName("oracle.jdbc.driver.OracleDriver"); Class.forName("com.sybase.jdbc.SybDriver"); } catch (ClassNotFoundException exp) { System.out.println("Bład ładowania sterownika: "+exp); } Okreslenie adresu URL połaczenia
_ adresy URL odwołujace sie do baz danych wykorzystuja protokół jdbc: i zawieraja informacje o nazwie komputera na którym działa serwer bazy danych, numer u_ywanego portu oraz nazwe bazy danych _ format zapisu adresu URL - podany w dokumentacji dostarczonej z konkretnym sterownikiem JDBC _ np.: String host="dbhost.firma.com.pl"; String db="nazwaBazy"; int port=1234; String oracleURL = "jdbc:oracle:thin:@” + host + ":” + port + ":” + db; String sybaseURL = "jdbc:sybase:Tds: " + host + ":” + port + ":” + "?SERVICENAME" +db; String msaccessURL = "jdbc:odbc " +db; Nawiazanie połaczenia - klasa Connection _ po zarejestrowaniu sterownika program łaczy sie za jego pomoca z baza danych _ nawiazanie połaczenia realizuje metoda getConnection klasy DriverManager: DriverManager.getConnection("url","user","pass"); _ wywołanie metody mo_e zgłosic wyjatek SQLException _ metoda zwraca obiekt klasy Connection _ np.: String user="beatap"; String haslo="tajne"; Connection polaczenie = DriverManager.getConnection( oracleURL, user, haslo); 2009-05-18 8 Interfejs Connection _ prepareStatement - tworzy prekompilowane zapytania do przesłania do bazy danych _ prepareCall - metoda odwołuje sie do procedur zachowanych, przechowywanych na serwerze BD _ rollback, commit - metody do obsługi transakcji; commit - zatwierdza zmiany, rollback - odrzuca wszystkie zmiany dokonane od ostatniego wywołania commit _ setAutoSubmit() - wyłacza opcje automatycznego dokonywania zmian _ close - zamyka otwarte połaczenie z baza danych _ isClosed - sprawdza czy nie skonczył sie okres wa_nosci połaczenia lub czy nie zostało ono jawnie zamkniete _ getMetaData - zwraca obiekt DataBaseMetaData _ Metody obiektu DatabaseMetaData: getDatabaseProductName - nazwa BD getDatabaseProductversion - numer wersji BD getDriverName - nazwa sterownika JDBC getDriverVersion - numer versji sterownika _ Np.: DatabaseMetaData dbmeta = polaczenie.getMetaData(); String nazwaBazy = dbmeta.getDatabaseProductName(); System.out.println("Baza danych: " + nazwaBazy ); String numerwersji = dbmeta.getDatabaseProductversion(); System.out.println("Numer wersji bazy: " +numerwersji); Utworzenie polecenia - obiekt Statement
_ do przesyłania zapytan i polecen do BD sa wykorzystywane obiekty Statement _ metoda createStatement() utworzonego obiektu klasy Connection zwraca obiekt Statement _ np. Statement polecenie=polaczenie.createStatement(); _ wiekszosc sterowników JDBC pozwala na jednoczesne tworzenie i u_ywanie wiekszej liczby obiektów Statement korzystajacych z tego samego połaczenia z BD Wykonanie zapytania _ dysponujac obiektem Statement mo_na ju_ przesłac zapytanie SQL _ executeQuery - przesyła zapytanie i w wyniku zwraca obiekt ResultSet przechowujacy wiersze tabeli wyników _ np. String zapytanie = "SELECT * FROM books"; ResultSet wynik=polecenie.executeQuery(zapytanie); Interfejs Statement - przesyłanie i wykonywanie dowolnych polecen SQL _ executeQuery - wykonuje polecenie SQL i zwraca dane w postaci obiektu ResultSet (obiekt mo_e byc pusty ale metoda nie zwraca null) _ executeUpdate - realizuje polecenia SQL UPDATE, INSERT, DELETE i zwraca liczbe rekordów objetych działaniem poszczególnych polecen (równie_ 0); obsługuje tak_e polecenia CREATE TABLE, DROP TABLE, ALTER TABLE _ executeBatch - wykonuje grupe polecen SQL jako jedna całosc i zwraca tablice wierszy objetych działaniem poszczególnych polecen; dodawanie polecen do grupy - metoda addBatch _ setQueryTimeout - okresla czas przez jaki sterownik bedzie czekał na odebranie wyników zanim zgłosi wyjatek SQLException _ getMaxRows, setMaxRows - max liczba wierszy jaka mo_e zawierac obiekt ResultSet (domyslnie 0 - nie ograniczona) danych Program Java JDBC & Driver Bazy danych Statement(SQL) ResultSet Statement(SQL) ResultSet
Interfejs ResultSet - przetworzenie wyników _ metoda next() zwraca kolejny wiersz lub false jesli osiagnieto koniec zbioru wynikowego _ getXxx - metody zwracajace wartosci niemal wszystkich podstawowych typów danych (np. getString(), getInt()) _ UWAGA! Kolumny zbioru wynikowego sa indeksowane (zgodnie z konwencja przyjeta w SQL) od 1 a nie od 0. _ odczytujac dane przechowywane w obiekcie ResultSet, lepiej jest u_ywac nazw kolumn (nie ich indeksów) - w przypadku zmiany struktury tabeli niebezpieczenstwo awarii kodu obsługujacego wyniki jest mniejsze Przykład - wyswietlenie wyników String host="dbhost.firma.com.pl"; String db="nazwaBazy"; int port=1234; String URL = "jdbc:odbc” + db ; String user="beatap"; String haslo="tajne"; Connection polaczenie = DriverManager.getConnection(URL, user, haslo); Statement polecenie=polaczenie.createStatement(); String zapytanie = "SELECT * FROM znajomi"; ResultSet wynik = polecenie.executeQuery(zapytanie); while (wynik.next()) { int id = wynik.getInt("id"); String n = wynik.getString("nazwisko"); String i = wynik.getString("imie"); String e = wynik.getString("email"); System.out.println(id+” "+n+” "+i+” "+e); } polaczenie.close(); Interfejs ResultSet _ next(), previous() _ relative(int) - przesuwa kursor o podana liczbe wierszy do przodu lub do tyłu (wartosc ujemna) _ absolute(int) - przesuwa kursor do wiersza o wskazanym numerze _ getXxx - zwraca wartosc odczytana z wiersza o podanej nazwie lub indeksie _ wasNull - sprawdza czy wartosc odczytana przez ostatnie wywołanie metody getXxx jest Null _ findColumn - zwraca indeks kolumny o podanej nazwie _ getRow - zwraca numer bie_acego wiersza (numerowane od 1) _ getMetaData - zwraca obiekt typu ResultSetMetaData opisujacy zawartosc ResultSet Obsługa baz danych przy u_yciu JDBC 23 Interfejs ResultSetMetaData _ getColumnCount _ getColumnName(int) _ getColumnType - zwraca wartosc int do porównania ze stałymi klasy java.sql.Types _ isReadOnly - czy wskazana kolumna tylko do odczytu _ isSearchable - czy wskazana kolumna mo_e byc zastosowana w klauzuli WHERE _ isNullable - czy wskazana kolumna mo_e zawierac NULL Zamkniecie połaczenia _ polaczenie.close(); _ Zamkniecie połaczenia powoduje równie_ zamkniecie u_ywajacych go obiektów Statement i ResultSet _ Je_eli planowane jest przeprowadzenie innych operacji na BD - nie nale_y zamykac połaczenia przed ich wykonaniem (koszt otwarcia nowego połaczenia jest dosc wysoki) _ W praktyce stosowanie ju_ otwartych połaczen jest bardzo wa_nym aspektem optymalizacji korzystania z baz danych _ API JDBC - definiuje specjalny interfejs ConnectionPoolDataSource do korzystania z pul połaczen Instalacja i konfiguracja serwera MySQL _ pobranie MySQL ze strony http://dev.mysql.com/downloads/ i zainstalowanie jako usługi systemowej (w Windows) - szczegółowe informacje na stronie http://dev.mysql.com/doc/ _ utworzenie bazy danych _ utworzenie u_ytkownika _ instalacja sterownika JDBC Przykład 1 - wyswietlanie danych z bazy MYSQL import java.sql.*; public class testBD { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); Connection polacz = DriverManager.getConnection("jdbc:mysql://localhost:3306 /dane", "root", ""); Statement zapytanie = polacz.createStatement(); ResultSet w=zapytanie.executeQuery("SELECT * FROM news"); Przykład 1 - c.d. while (w.next()) { int id = w.getInt("Lp"); String n = w.getString("Naglowek"); String i = w.getString("Tresc"); String e = w.getString("Autor"); System.out.println(id+" "+n+" "+i+" \n"+e); } polacz.close(); } } Przykład 1a Przykład zmodyfikowanego zapytania SQL ResultSet w = zapytanie.executeQuery( "SELECT Autor FROM news"); while (w.next()) { String n = w.getString("Autor"); System.out.println(n); } Przykład 1b - dodawanie rekordów do bazy Statement zapytanie = polacz.createStatement(); int x = zapytanie.executeUpdate("INSERT INTO news (Autor, Naglowek, Tresc) VALUES ('Wilk`, 'Tytul`, 'Tresc')"); System.out.println("Dodano rekordow: " + x); Zalety JDBC _ łatwosc u9ycia (dzieki temu, _e jest ju_ zdefiniowany interfejs i wszystkie mechanizmy do obsługi baz danych, pozostaje jedynie z niego skorzystac) _ uniwersalnosc (jak z ka_dego produktu SUN z JDBC mo_na korzystac na ka_dej platformie; obsługa ró_nych rodzajów baz danych (Oracle, Access, MySQL itd.) jest bardzo podobna Wady JDBC _ niska wydajnosc (poniewa_ jest to interfejs - zanim zapytanie powedruje do bazy danych, jest ono przetwarzane do postaci uniwersalnej, rozumianej przez wszystkie systemy oraz bazy danych; nawet jesli u_ytkownik pracuje na dwóch identycznych bazach danych, to i tak komunikacja miedzy nimi sprowadza sie do tłumaczenia na "jezyk uniwersalny " a dopiero potem dostarczania docelowej bazie danych) _ niski poziom bezpieczenstwa (aby komunikacja z baza danych mogła przebiegac w miare szybko i byc przy tym uniwersalna poziom bezpieczenstwa jest tutaj JAVA - Swing: J-komponenty Style interfejsu _ Wyglad wzorowany na standardzie _ Wyglad wzorowany na standardzie Motif X Windows _ Rodzimy styl interfejsu pakietu Swing (Metal) Definiowanie stylu interfejsu Klasa UIManager - wyglad GUI; Metody: _ setLookAndFeel(LookAndFeel) - pozwala zmienic wyglad GUI _ getCrossPlatformLookAndFeelClassName() - zwraca obiekt LookAndFeel stylu Metal _ getSystemLookAndFeelClassName() - zwraca obiekt LookAndFeel stylu €zywanego przez system operacyjny Np. - ustawienie stylu Metal try {UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName());} catch (Exception e){System.out.println("Nie mo8na zmienic"); } Tworzenie szkieletu aplikacji - przykład 1 import javax.swing.*; public class swing1 { public static void main(String[] args) { JFrame fr = new JFrame("Szkielet aplikacji"); JLabel et = new JLabel("Swing!!!"); fr.getContentPane().add(et); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.pack(); fr.setVisible(true);}} Tworzenie szkieletu aplikacji - przykład 1a import javax.swing.*; public class swing1a extends JFrame{ public swing1a() //konstruktor klasy swing1a { super("Szkielet aplikacji"); //wywołanie konstruktora JFrame setSize(300,100); //ustalenie wymiarów JFrame JLabel et = new JLabel("Swing!!!"); getContentPane().add(et); //dodanie et do panelu ramki setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { swing1a sw1=new swing1a();//utworzenie obiektu klasy swing1a Dodawanie składników do kontenera _ dowolny składnik GUI musi zostac dodany do kontenera (np. JFrame, JWindow, JPanel, JApplet) a sam kontener musi zostac wyswietlony na ekranie; _ JPanel - najprostszy kontener (panel) dodawany do innych kontenerów _ W celu dodania składnika do panelu zawartosci kontenera nale8y (najczesciej) : utworzyc panel JPanel p=new JPanel(); dodac do niego składniki za pomoca metody p.add(Component) wywołac metode setContentPane(p) z panelem jako parametrem wywołania Dodawanie składników do kontenera - przykład 2 import javax.swing.*; public class swing2 extends JFrame{ JButton ok=new JButton("OK"); JButton anuluj=new JButton("Anuluj"); JButton koniec=new JButton("Koniec"); public swing2() {super("Przyciski JButton"); setSize(250,80); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p1=new JPanel(); p1.add(ok); p1.add(anuluj); p1.add(koniec);
|
na niezbyt wysokim poziomie) JAVA - Tworzenie apletów mgr Mariusz Kujawiak Aplet a aplikacja _ Aplikacje sa uruchamiane poprzez interpreter jezyka Java (poleceniem java z wiersza polecen - narzedzie SDK) _ Aplety sa uruchamiane w dowolnej przegladarce sieciowej obsługujacej jezyk Java (jesli tylko zainstalowane zostały plug-in do przegladarek - do sciagniecia ze strony http://java.com odnosnikiem free download) lub za pomoca polecenia appletviewer (narzedzie z SDK) Bezpieczenstwo apletów Java Aplet nie mo0e: _ odczytywac i zapisywac plików na komputerze u0ytkownika _ komunikowac sie z inna witryna WWW ni0 ta, z
której został załadowany _ ładowac i pobierac z komputera u0ytkownika 0adnych programów (aplikacji, bibliotek) Tworzenie apletów (1) _ aplety nie posiadaja metody main(), posiadaja natomiast kilka ró0nych metod, które sa wywoływane na ró0nych etapach wykonywania apletu _ wszystkie aplety sa podklasami albo klasy JApplet z pakietu javax.swing albo jej klasy bazowej Applet z pakietu java.applet Tworzenie apletów (2) Podklasy apletu tworzone przez u0ytkownika przyjmuja postac: public class mojAplet extends javax.swing.JApplet { //kod zródłowy apletu } lub public class mojAplet extends java.applet.Applet { //kod zródłowy apletu } Metody wykorzystywane w apletach _ init() inicjalizacja _ start() uruchamianie _ stop() zatrzymywanie _ destroy() destrukcja _ paint() wyswietlanie Uwaga!!! powy0sze metody domyslnie nic nie robia; aby cokolwiek zostało wykonane nale0y przesłonic je nowa wersja z odpowiednimi poleceniami Metoda init() _ inicjalizacja apletu nastepuje w momencie jego załadowania do przegladarki sieciowej; mo0e obejmowac tworzenie obiektów, nadawanie wartosci poczatkowych, ładowanie rysunków lub czcionek, ustawianie parametrów pracy _ aby prawidłowo zainicjalizowac aplet nale0y przesłonic metode init() nastepujaco: public void init() { //kod metody } Metoda start() _ aplet jest uruchamiany po zakonczeniu inicjalizacji; uruchamianie mo0e zachodzic wiele razy, inicjalizacja - tylko raz _ zadania do realizacji w momencie uruchamiania moga obejmowac np. wysyłanie komunikatów itp. _ aby prawidłowo uruchomic aplet nale0y przesłonic metode start() nastepujaco: public void start() { //kod metody }
Metoda stop() _ zatrzymywanie i uruchamianie apletu wzajemnie sie uzupełniaja; zatrzymywanie nastepuje gdy u0ytkownik opuszcza strone lub kiedy aplet zatrzymuje sam siebie jawnie wywołujac metode stop() (domyslnie watek uruchomiony przez aplet kontynuuje prace nawet, je0eli u0ytkownik opuscił ju0 strone z apletem; poprzez przesłoniecie metody stop() mo0na zawiesic realizacje takich watków i uruchomic je kiedy aplet ponownie staje sie widoczny public void stop() { //kod metody } Metoda destroy() _ metoda destroy() pozwala apletowi na usuniecie swoich danych roboczych zanim on sam zostanie usuniety z pamieci lub zanim okno przegladarki zostanie zamkniete; metody mo0na u0yc do usuniecia dowolnego aktywnego watku uruchomionego przez aplet public void destroy() { //kod metody } _ w normalnej sytuacji rzadko stosuje sie te metode, gdy0 java posiada automatyczny mechanizm zwalniania zasobów pamieci Metoda paint() _ metoda pozwala na wyswietlanie w oknie apletu ró0nych elementów (tekst, linie, tło, rysunki) public void paint(Graphics g) { //kod metody } _ metoda pobiera argument - obiekt klasy Graphics; obiekt ten jest tworzony i przekazywany przez sama przegladarke; dodatkowo nale0y do kodu apletu zaimportowac klase: import java.awt.Graphics; //lub import java.awt.*; Przykład 1 - Aplet wyswietlajacy godz. i date Wykorzystywane klasy i metody: _ GregorianCalendar - klasa z pakietu java.util, która reprezentuje wartosci daty i czasu zgodnie z układem kalendarza gregorianskiego _ Font - klasa z pakietu java.awt reprezentujaca rozmiar, styl i rodzaj wyswietlanej czcionki _ Color oraz Graphics2D - klasy z pakietu java.awt _ Metoda sleep() klasy Thread (watek) generuje wyjatek InterruptedException, który musi zostac ujety w blok polecen try / catch import java.awt.*; import java.util.*; /* Aplet zegar.class - wyswietla biezacy czas i date, co 1 s */ public class zegar extends javax.swing.JApplet { private Color kolor=new Color(255,204,102);//bursztynowy private String ost_czas=""; public void init() { //ustalamy kolor tla okna apletu: setBackground(Color.black); } public void paint(Graphics ekran) { //obiekt Graphics2D przechowuje dane //o aktualnych ustawieniach czcionek i kolorów Graphics2D ekran2D=(Graphics2D)ekran; Przykład 1 - kod zródłowy c.d.
Font typ=new Font("Monospaced",Font.BOLD,20); ekran2D.setFont(typ); //ustawienia czcionki: //obiekt przechowujacy biezaca date i czas: GregorianCalendar dzien=new GregorianCalendar(); String czas=dzien.getTime().toString(); ekran2D.setColor(Color.black); //na pozycji o wspolrzednych (5,25) wyswietlany jest ost_czas: ekran2D.drawString(ost_czas,5,25); ekran2D.setColor(kolor); ekran2D.drawString(czas,5,25); try { Thread.sleep(1000); // opoznienie o 1000ms (1s) } catch(InterruptedException e) { /*nic nie rob*/ } ost_czas=czas; //przerysowanie okna apletu - ponowne wywolanie paint() repaint(); }} 2009-05-25 8 Przykład 1 - wstawianie apletu na strone WWW (plik .htm) <html><body> <applet code="zegar.class” height=50 width=355> Program wymaga przegladarki obsługujacej aplety Java </applet> </body></html> Parametr align align align align znacznika <Applet> Wartosci parametru: _ left, right - ustawia okno apletu po lewej (prawej) stronie nastepujacego po nim tekstu (np. align="right" ) _ texttop - wyrównuje górna krawedz okna apletu z górna krawedzia najwy0szego znaku w wierszu _ top, bottom (lub baseline) - wyrównuje górna (dolna) krawedz okna apletu z górna (dolna) krawedzia najwy0szego (najni0szego) elementu w wierszu _ absbottom - wyrównuje dół okna apletu z najni0szym elementem w wierszu _ absmiddle - wyrównuje srodek okna apletu ze srodkiem najwy0szego elementu w wierszu _ middle - wyrównuje srodek okna apletu ze srodkiem linii bazowej wiersza tekstu Inne parametry znacznika <Applet> _ hspace, vspace - ustawienie odstepu (w pikselach) pomiedzy oknem apletu a otaczajacym go tekstem np. hspace=10 _ code, codebase - u0ywane do wskazania miejsca, w którym znajduja sie główna i pomocnicze klasy apletu Java np. <applet code="zegar.class” codebase= "http://www.serwer/klasyjava"> Uniwersalny znacznik <Object> _ •<object classid="java:zegar.class" codebase="klasyjava" height=40 width=400> </object> _ Parametry znacznika <object>: codebase, height, width, align jak w znaczniku <Applet> Pliki archiwum JAR _ archiwum Java - zbiór klas Java oraz innych plików spakowanych do jednego pliku; ogranicza ilosc niezbednych do załadowania i uruchomienia apletu połaczen przegladarki z serwerem WWW do jednego; tworzone za pomoca narzedzia jar z SDK (bez kompresji lub kompresja .zip) _ Parametry jar (samo jar podaje liste parametrów): c - utworzenie archiwum java f - kolejny parametr to nazwa tworzonego archiwum, np. jar cf animacje.jar *.class *.gif jar cf arch.jar j1.class j1.au j2.au _ Wywołanie apletu z archiwum: <applet code="j1.class" archives="arch.jar" width=45 height=45> Przekazywanie parametrów do apletu _ Parametry apletów przekazywane sa w pliku HTML za pomoca znacznika w bloku <applet>…</applet>: <param name="nazwa" value="wartosc"> Np.: <applet code="zegar.class" width=100 height=50> <param name=font value="TimesRoman"> <param name=wys value="24"> Java aplet </applet> _ Aplet mo0e odczytac parametry za pomoca metody getParameter() zwracajacej łancuch tekstu lub null (w przypadku braku parametrów) Przykład 2 - modyfikacja apletu zegar, przekazanie koloru tła jako parametru import java.awt.*; import java.util.*; /* Aplet zegar1.class - modyfikacja zegar.class s */ public class zegar1 extends javax.swing.JApplet { private Color kolor=new Color(255,204,102);//bursztynowy private String ost_czas=""; Color kolor1; //wprowadzono nowy obiekt klasy Color public void init() { String we=getParameter("tlo"); kolor1=Color.black; if (we!=null) { try {kolor1=Color.decode(we);} catch (NumberFormatException e) {showStatus("Zly parametr:"+we);}} setBackground(kolor1); } Przykład 2 - c.d. public void paint(Graphics ekran) { Graphics2D ekran2D=(Graphics2D)ekran; Font typ=new Font("Monospaced",Font.BOLD,20); ekran2D.setFont(typ); GregorianCalendar dzien=new GregorianCalendar(); String czas=dzien.getTime().toString(); ekran2D.setColor(kolor1); ekran2D.drawString(ost_czas,5,25); ekran2D.setColor(kolor); ekran2D.drawString(czas,5,25); try{ Thread.sleep(1000); } catch(InterruptedException e) { } ost_czas=czas; //przerysowanie okna apletu (ponowne wywolanie paint() repaint(); }} Przykład 2 - plik HTML <html> <body bgcolor="#996633"> <p> BieIacy czas: <applet code="zegar1.class" height=50 width=355> <param name="tlo" value="#996633"> Aplet Java </applet> </body></html>
JAVA Wielowatkowosc - klasa Thread mgr Mariusz Kujawiak Watki i programowanie współbie_ne _ Jedna z metod rozwiazywania problemu - podział programu na odrebne zadania _ Watek (thread) - zadanie działajace niezaleznie od głównego programu _ •Z punktu widzenia uzytkownika - jednoczesne wykonywanie wielu czynnosci _ Obsługa ka,dego watku przez odrebny procesor (tzw. programowanie równoległe) _ Wiecej watków ni, procesorów - emulowanie współbie,nosci _ Cechy programowania współbie,nego polepszenie zarzadzania zasobami wieksza wygoda u,ytkownika emulacja - zmniejszenie wydajnosci Wielowatkowosc w Javie _ Jezyk tworzy osobny stos i osobne rejestry dla ka,dego watku koordynuje i szereguje watki _ Szeregowanie watków - okreslanie dostepu do procesora pierwszenstwo - watki o wy,szym priorytecie watki równoprawne - przełaczane na zmiane _ Klasa java.lang.Thread klasa bazowa watków zawiera metody konieczne do obsługi watków _ Główne metody watku (domyslnie puste) run() - okresla zachowanie watku start() - uruchamia watek, wywołuje run() _ Metody programowania watków utworzenie klasy pochodnej po Thread implementacja interfejsu Runnable 3 Dziedziczenie po klasie Thread - aplikacja. TestWatkow (przykład 1) class MojWatek extendsThread { int numer; public MojWatek(int numer) { super(); this.numer = numer; } public void run() { System.out.println("Watek: "+ numer); } } public classTestWatkow { public static void main(String args[]) { MojWatek w1, w2; w1 = new MojWatek(1); w2 = new MojWatek(2); w1.start(); w2.start(); System.out.println("Watek: 0"); } } Dziedziczenie po klasie Thread - klasa Watek (przykład 2) classWatek extendsThread { String wysun = ""; public Watek(String str, int numer) { super(str); //wciecie z jakim bedzie wyswietlana nazwa Watku for (int i = 1; i < numer; i++) wysun = wysun + "\t"; } public void run() { for (int i = 0; i < 4; i++) { System.out.println(wysun + i + " " + getName()); try { sleep( (int)(Math.random() * 1000) ); } catch ( InterruptedException e ) {e.printStackTrace(); } } System.out.println(wysun + getName()+ " koniec" ); } } JAVA, Wielowatkowosc - klasa Thread 5 Dziedziczenie po klasie Thread - PierwszyWielowatkowy (przyk. 2 c.d.) class PierwszyWielowatkowy { public static void main (String[] args) throws Exception { newWatek("Janek",1).start(); newWatek("Magda",2).start(); newWatek("Wacek",3).start(); newWatek("Ola",4).start(); pauza(); } static void pauza() throws Exception { System.out.print(" Nacisnij Enter.....\n"); System.in.read(); } } Interfejs Runnable _ Implementacja interfejsu w klasie głównej - zawiera te sama metode run() _ Tworzenie obiektu watku Thread watek = newThread(); _ Uruchamianie watku watek.start(); Implementacja interfejsu Runnable - klasa WatekPodstawowy (przyk. 3) classWatekPodstawowy implements Runnable { String wysun = ""; // W polu danych biezacy przechowywana jest referencja do // watku,w którym wykonana zostanie klasa WatekPodstawowy Thread biezacy; public WatekPodstawowy( int numer) { // metoda statyczna currentThread() klasy Thread // zwaca referencje do bie,acego watku biezacy = Thread.currentThread(); for (int i = 1; i < numer; i++) wysun = wysun + "\t"; } Implementacja interfejsu Runnable - klasa WatekPodstawowy (przykład 3 c.d.) public void run() { for (int i = 0; i < 4; i++) { // dzieki referencji biezacy mo,emy na rzecz tego // watku wykonac metode getName() (z klasy Thread) System.out.println(wysun+i+" "+biezacy.getName() ); try { biezacy.sleep((int)(Math.random() * 1000));} catch (InterruptedException e) {} } System.out.println(wysun + biezacy.getName()+ " koniec" ); } } Aplikacja DrugiWielowatkowy (przykład 3 c.d.) public class DrugiWielowatkowy {// deklaracja tablicy watków, deklarujemy ja jako static - tylko do pól // statycznych klasy mo,emy sie odwołac w statycznej metodzie main() staticThread watki[]; public static void main (String[] args) throws Exception { // przypisanie do pola watki tablicy referencji do obiektów typu Thread watki = newThread[4]; // inicjalizacja elementów tablicy watki watki[0] = newThread( newWatekPodstawowy(1),"Janek"); watki[1] = newThread( newWatekPodstawowy(2),"Magda"); watki[2] = newThread( newWatekPodstawowy(3),"Wacek"); watki[3] = newThread( newWatekPodstawowy(4),"Ola"); // uruchomienie watków for (int i=0; i<4; i++) watki[i].start(); pauza(); } static void pauza() throws Exception { /*jak poprzednio*/ } } 4 stany ,ycia watku _ newThread (nowy watek) - stan powstaje w momencie stworzenia obiektu-watku _ Runnable (watek uruchamialny) - watek przechodzi po wywołaniu metody start(), która z kolei wywołuje metode run() _ NotRunnable (watek zablokowany), _ Dead (watek martwy) - watek konczy działanie na skutek zakonczenia metody run() i przechodzi do stanu Dead (nadal mo,e istniec obiekt oznaczajacy watek ale nie jest dozwolone ponowne u,ycie wobec niego metody start(); aby ponownie uruchomic watek nale,y stworzyc nowy obiekt i dopiero zastosowac metode start() Stan NotRunnable Do stanu NotRunnable watek przechodzi na skutek: _ wywołania metody sleep (usypiajacej watek); powrót do stanu Runnable nastepuje po upływie podanego czasu _ wywołania metody wait (watek czeka na powiadomienie o jakims zdarzeniu); powrót do stanu Runnable nastepuje po tym jak inny obiekt powiadomi watek o nastapieniu danego zdarzenia za pomoca metody notify lub notifyAll _ blokowania na operacjach we/wy; powrót do stanu Runnable nastepuje po zakonczeniu operacji _ blokowanie na obiekcie synchronizowanym Cykl ,ycia watku start() run() blokowanie zakonczenie metody run() Priorytety watków _ Priorytety informuja funkcje systemowe, któremu watkowi przydzielic czas procesora w przypadku, gdy chce z niego korzystac kilka watków (watki o wy,szych priorytetach - czestszy dostepne do czasu procesora). Java definiuje 10 priorytetów: 10 (zadania krytyczne) 6-9 (obsługa zdarzen, interakcja z GUI) 5 (normalny) 4 (we/wy) 2-3 (działanie w tle) 1 (gdy nic innego sie nie wykonuje _ Watek ma taki sam priorytet jak watek, który go stworzył. Pierwotny watek (metoda main() ) ma priorytet 5 Priorytety watków _ Metody obsługi priorytetów (w praktyce rzadko u,ywane) odczytanie priorytetu - getPriority() ustawianie priorytetu - setPriority() _ Argument metod - liczba całkowita z zakresu od Thread.MIN_PRIORITY do Thread.MAX_PRIORITY Synchronizacja watków _ Równolegle wykonujace sie watki moga współdzielic zasoby, odwołujac sie na przykład do tego samego obiektu. Aby uniknac równoczesnego działania watków na tym samym obiekcie stosuje sie blokady (rygle). _ Ka,dy egzemplarz klasy Object i jej podklas ma rygiel. Blokowanie obiektów dokonuje sie automatycznie i sterowane jest słowem kluczowym synchronized. _ Synchronizowane moga byc metody i bloki. _ Deklaracja metody synchronizowanej oznaczana jest jako: synchronized void metoda() { ... } _ Bloki synchronizowane wprowadzane sa za pomoca instrukcji synchronized z podana w nawiasie referencja do obiektu, który ma byc zablokowany Metody synchronizacji watków _ Skoordynowanie interakcji miedzy watkami uzyskuje sie za pomoca metod klasy java.lang.Object: _ wait() - blokowanie watku na czas nieokreslony (lub wait(n) na n milisekund) _ notify() - ponowne uruchamianie watku (zdejmuje blokade z danego watku) _ notifyAll() - odblokowuje wszystkie watki oczekujace na dany obiekt _ Działanie powy,szych metod jest zawsze zwiazane z konkretnymi obiektami a jednoczesnie dotyczy watków (zazwyczaj innych obiektów), które na tych konkretnych obiektach operuja Przykład 4 - schemat prawidłowej koordynacji działan 2 watków _ jeden watek ustala wartosc n za pomoca put _ drugi pobiera wartosc n za pomoca get _ watek pobierajacy musi czekac, a, watek ustalajacy ustali wartosc n _ ustalenie wartosci powoduje dwie zmiany: warunek ready ma wartosc true oczekiwanie jest przerywane przez notify Przykład 4 - kod zródłowy class X { int n; boolean ready=false; ... synchronized int get() { try { while (!ready) wait(); } catch (InterruptedException exc) { ... } ready=false; return n; } //koniec metody get synchronized void put(int i) { n=i; ready=true; notify(); } //koniec metody put } //koniec klasy X 2009-05-31 11 Przerywanie watków _ Metoda interrupt z klasy Thread powoduje przerwanie watku co powoduje powstanie wyjatku InterruptedException (wyjatek ten musi zostac przechwycony) _ Przerwanie watku jest koniecznie w przypadku zbyt długiego czasu oczekiwania (wait) na zdarzenie, które nie nastepuje JAVA, Wielowatkowosc - klasa Thread 21 Przykład 5 Producent-Klient _ Producent generuje liczbe z przedziału 0÷9 zapisuje ja w obiekcie klasy Dane wyswietla wygenerowana liczbe wykonuje czynnosci nieregularnie - zasypia" na przypadkowy czas z zakresu 0÷100 [ms] _ Klient wczytuje liczbe z obiektu klasy Dane wyswietla wczytana liczbe Klasa Producent i klasa Klient class Producent extends Thread { private Dane dane; public Producent(Dane c) { dane = c; } public void run() { for (int i = 0; i < 10; i++) { dane.pisz(i); System.out.println("Zapis: " + i); try {sleep((int)(Math.random()*100)); } catch (InterruptedException e) {} } }} class Klient extends Thread { private Dane dane; public Klient(Dane c) { dane = c; } public void run() { int x = 0; for (int i = 0; i < 10; i++) { x = dane.czytaj(); System.out.println("Odczyt: " + x); } }} Producent-Klient: klasa Dane public class Dane { private int d; private boolean dostepne = false; public synchronized int czytaj() { while (dostepne == false) { try { wait(); } catch (InterruptedException e) {} } dostepne = false; notifyAll(); return d; } public synchronized void pisz(int x) { while (dostepne == true) { try { wait(); } catch (InterruptedException e) {} } d = x; dostepne = true; notifyAll(); } } Producent-Klient: aplikacja TestPK public class TestPK { public static void main(String[] args) { Dane d = new Dane(); Producent p1 = new Producent(d); Klient k1 = new Klient(d); p1.start(); k1.start(); } } Watki w apletach - animacje _ Etapy tworzenia animacji tworzenie rysunku („ramki” animacji) wyswietlenie ramki - złudzenie ruchu _ Aplety stanowia swego rodzaju watki - wykonanie animacji w aplecie mo,liwe jest dzieki jego metodom: start() - tworzy nowy watek apletu stop() - zatrzymuje watek apletu Aplet Zegar import javax.swing.*;import javax.swing.border.*; import java.awt.*; import java.util.*; import java.text.DateFormat; public class Zegar extends JApplet implements Runnable { JLabel napis = new JLabel("",JLabel.CENTER); Thread watek; public void init() { Font f = new Font("serif", Font.BOLD, 24); Container kont = getContentPane(); napis.setOpaque(true); napis.setFont(f); napis.setBackground(Color.lightGray); napis.setForeground(Color.red); Border b = BorderFactory.createRaisedBevelBorder(); napis.setBorder(b); kont.add(napis, BorderLayout.CENTER); } Aplet Zegar c.d. public void start() {//metoda apletu if (watek == null) { watek = newThread(this); watek.start(); } } public void stop() { //metoda apletu if (watek != null) watek = null; } public void run() { //metoda run() watku Thread watekAktualny = Thread.currentThread(); while (watek == watekAktualny) { Calendar cal = Calendar.getInstance(); Date data = cal.getTime(); DateFormat df = DateFormat.getTimeInstance(); napis.setText(df.format(data)); napis.repaint(); try { Thread.sleep(1000); } catch (InterruptedException e) { } }}} Problemy z watkami _ Impas (deadlock) - zamknieta petla watków, czekajacych na siebie nawzajem _ Programy wykorzystujace watki skomplikowane utrudnione wykrywanie błedów. setContentPane(p1); setVisible(true); } public static void main(String[] args) {swing2 sw2=new swing2(); } } JAVA - Swing: J-komponenty Dodawanie składników do apletu _ Okno apletu - rodzaj kontenera; czesc GUI przegladarki; w momencie kiedy aplet zaczyna prace okno jest ju8 otwarte a jego rozmiary sa okreslone przez znacznik HTML _ Aplet zaimplementowany w pakiecie Swing posiada panel zawartosci odseparowany od innych paneli; poszczególne składniki interfejsu dodawane powinny byc do panelu zawartosci a nie do samego apletu Dodawanie składników do apletu - przykład 2a import javax.swing.*; public class swing2a extends JApplet{ JButton ok=new JButton("OK"); JButton anuluj=new JButton("Anuluj"); JButton koniec=new JButton("Koniec"); public void init() { JPanel p1=new JPanel(); p1.add(ok); p1.add(anuluj); p1.add(koniec); setContentPane(p1); } } JAVA - Swing: J-komponenty Standardowe okna dialogowe Metody klasy JOptionPane: _ ConfirmDialog - okno do zadawania pytan z przyciskami Yes, No i Cancel _ InputDialog - wyswietla tekst zachety i pozwala u8ytkownikowi na wpisanie dowolnego tekstu _ MessageDialog - wyswietla informacje _ OptionDialog - kombinacja powy8szych okien _ JFileChooser - dialog wyboru pliku _ JColorChooser - dialog wyboru kolorów Okna dialogowe - przykład 3 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class dialogi extends JFrame implements ActionListener { JFileChooser fc=new JFileChooser(); JButton b1,b2,b3; dialogi() //konstruktor { super("Dialogi"); FlowLayout flow=new FlowLayout(FlowLayout.CENTER,10,10); getContentPane().setLayout(flow); super.setSize(400,100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] etykieta={"Otwórz plik","Zapisz plik","Wybierz kolor"}; b1=new JButton(etykieta[0]); b1.addActionListener(this); b2=new JButton(etykieta[1]); b2.addActionListener(this); b3=new JButton(etykieta[2]); b3.addActionListener(this); getContentPane().add(b1); getContentPane().add(b2); getContentPane().add(b3); setVisible(true); } //koniec konstruktora dialogi Okna dialogowe - przykład 3 public void actionPerformed(ActionEvent e) { Object ob1=e.getSource(); if (ob1==b1) { int wybor=fc.showOpenDialog(this); if (wybor==JFileChooser.APPROVE_OPTION) pisz("Otwieram plik "+ fc.getSelectedFile());} if (ob1==b2) { int wybor=fc.showSaveDialog(this); if (wybor==JFileChooser.APPROVE_OPTION) pisz("Zapisuje plik "+ fc.getSelectedFile()); } if (ob1==b3) { Color kol=JColorChooser.showDialog(this,"Wybierz kolor", getBackground()); if (kol==null) return; pisz("Wybrany kolor: "+ kol); setBackground(kol); } } //koniec metody actionPerformed Okna dialogowe - przykład 3 Składniki pakietu Swing - wspólne metody javax.swing.JComponent - klasa bazowa pakietu Swing z metodami: _ setEnabled(boolean) - aktywuje/dezaktywuje składnik; domyslnie składniki sa właczone; stan składnika podaje metoda isEnabled() _ setVisible(boolean) - wyswietla/ukrywa składnik; stan składnika podaje metoda isVisible() _ setSize(int, int) - zmienia rozmiary do wysokosci i szerokosci podanej jako parametry; getSize() - podaje rozmiary _ setText() i getText() dla składników tekstowych _ setValue() i getValue() dla składników przechowujacych wartosci numeryczne Przyciski z ikonami - przykład 4 import javax.swing.*; public class swing3 extends JFrame{ public swing3() {super("Ikony na przyciskach"); setSize(100,300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p1=new JPanel(); ImageIcon ikona1=new ImageIcon("javalogo.gif"), ikona2=new ImageIcon("sunlogo.gif"); JButton pjava=new JButton(ikona1); JButton psun=new JButton(ikona2); p1.add(pjava); p1.add(psun); setContentPane(p1); setVisible(true); } public static void main(String[] args) { swing3 sw3=new swing3(); } } Etykiety JLabel Konstruktory: _ JLabel(String) - etykieta tekstowa _ JLabel(String, int) - etykieta tekstowa z wyrównanie _ JLabel(String, Icon, int) - etykieta z tekstem, ikona i okreslonym sposobem wyrównania Sposoby wyrównania (domyslnie CENTER): _ SwingConstants.LEFT _ SwingConstants.CENTER _ SwingConstants.RIGHT U8yteczne metody: _ setText(String), setIcon(Icon) - ustawienie zawartosci _ getText(), getIcon() - odczytanie zawartosci etykiety Np. JLabel l=new JLabel("Koniec",SwingConstants.RIGHT); Pola tekstowe JTextField Konstruktory: _ JTextField() - tworzy puste pole tekstowe _ JTextField(int) - pole tekstowe o okreslonej długosci _ JTextField(String, int) - pole tekstowe o okreslonej długosci wypełnione podanym tekstem U8yteczne metody: _ setEditable(boolean) - pole edytowane/nie edytowane, isEditable() zwraca stan pola _ setText(String) - zmiana zawartosci pola _ getText() - zwraca zawartosc pola _ getSelectedText() - zwraca zaznaczona przez u8ytkownika zawartosc pola Pole tekstowe: JPasswordFields, metoda ustalajaca znak pojawiajacy sie na ekranie setEchoChar(char) Obszary tekstowe JTextArea Konstruktory: _ JTextArea(int, int) - obszar tekstowy o okreslonej liczbie wierszy i kolumn _ JTextArea(String, int, int) - obszar tekstowy wypełniony tekstem U8yteczne metody: _ setText(String) _ getText() _ getSelectedText() _ append(String) - dodanie łancucha na koncu tekstu _ insert(String, int) - wstawienie łancucha w miejscu wskazanym przez u8ytkownika _ setLineWrap(true) - automatycJAzVAn -eSw iznga: Jw-koimjpaonneinety tekstu Formularz - przykład 5 import javax.swing.*; public class formularz extends JFrame { JTextField uzytkownik=new JTextField(15); JPasswordField haslo=new JPasswordField(15); JTextArea komentarz=new JTextArea(4,15); public static void main(String[] args) { formularz f=new formularz(); } Formularz - przykład 5 public formularz() { super("Formularz"); setSize(260,160); setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel p1=new JPanel(); JLabel l1=new JLabel("Uzytkownik : "); JLabel l2=new JLabel("Haslo : "); JLabel l3=new JLabel("Komentarz : "); komentarz.setLineWrap(true); komentarz.setWrapStyleWord(true); p1.add(l1); p1.add(uzytkownik); p1.add(l2); p1.add(haslo); p1.add(l3); p1.add(komentarz); setContentPane(p1); setVisible(true);
|
|
|
|