java ki ki, Zarządzanie i inżynieria produkcji, KPD


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);



Wyszukiwarka