Professional Documents
Culture Documents
Javom
upoznavanje s
Settints
System
Environment Variables
PATH
for-petlje
class Count {
public static void main (String args[]) {
int i;
for (i = 0; i < 50; i=i+1) {
System.out.println (i);
}
}
}
Deklaracijavarijabliunutarpetlje
class Count {
public static void main (String args[]) {
for (int i = 0; i < 50; i = i+1) {
System.out.println (i);
}
}
}
Increment:
class Count {
public static void main (String args[]) {
for (int i = 0; i < 50; i++) {
System.out.println (i);
}
}
}
Decrement:
class Count {
public static void main (String args[]) {
for (int i = 50; i > 0; i--) {
System.out.println (i);
}
}
}
Nardbe za ispis
class PrintArgs {
public static void main (String args[]) {
for (int i = 0; i < args.length; i++) {
System.out.println (args[i]);
}
}
}
% java PrintArgs Hello there!
Hello
there!
%
System.err.println ()
System.err .
Fibonaccijevi brojevi
class Fibonacci {
public static void main (String args[]) {
int low = 1;
int high = 0;
System.out.println (low);
while (high < 50) {
System.out.println (high);
int temp = high;
high = high + low;
low = temp;
}
}
}
int
long
float
double
char
Ne
class Variables {
public static void main (String args[]) {
boolean b = true;
int low = 1;
long high = 76L;
long middle = 74;
float pi = 3.1415292 f;
double e = 2.71828;
String s = "Hello World!";
}
}
Kommentari
Komentarise u Javioznacavajuna istinacinkao u C++. Sve izmedu/* i */ ce se
ignorirati,a u pojedinacnimlinijamabit ce odbaceno sve nakon // (do kraja linije).
Takoder postojiposeban oblikkomentaraza javadoc alat za automatizirano
dokumentiranjejava programa. Piuse izmeduznakova/** i */.
/**
* Ovako se pisu komentari za javadoc
*/
class HelloWorld {
public static void main (String args[]) {
/* Ispisujemo liniju Hello World */
a ne u
int i = 7876;
Objekti
Objekt je primjerak(instanca) klase.
Objekte moetekreiratipomocukljucnerijecinew izakoje slijeditzv. konstruktor
klase. Sljedeciprogramkreira objekt tipa TwoDPoint i ispisujenjegoveatribute:
class OriginPrinter {
public static void main(String[] args) {
TwoDPoint origin; // ovime smo deklarirali (ne i alocirali )
objekt origin
origin = new TwoDPoint (); // sada smo uz pomoc konstruktora
alocirali (kreirali objekt)
origin.x = 0.0;
origin.y = 0.0;
Obrada:
% javac TwoPointPrinter .java
% java TwoPointPrinter
Ishodiste ima koordinate 0.0, 0.0
Tocka one ima koordinate 1.0, 0.0
%
// print
System.out.println ("Tocka origin1 ima koordinate " + origin1.x
+ ", " + origin1.y);
System.out.println ("Tocka origin2 ima koordinate " + origin2.x
+ ", " + origin2.y);
}
Obrada i izlaz:
% javac EqualPointPrinter .java
% java EqualPointPrinter
Tocka origin1 ima koordinate 0.0, 0.0
Tocka origin2 ima koordinate 0.0, 0.0
%
Primijetiteda su origin1 i origin2 dvijerazlicitereferentnevarijablekoje referenciraju
istiobjekt tipa point .
Staticke varijable
Statickavarijablaje varijablaklase, ona pripada klasi(samoj klasi), a ne nekom
objektu (instanciklase).
class Point {
double x;
double y;
static double xorigin = 0.0;
Obrada:
% javac Point.java
% javac PointPrinter .java
% java PointPrinter
Ishodiste je u tocki (0.0, 0.0)
%
Metode
Metode kau to nekiobjekt radi.
class TwoDPoint {
double x;
double y;
void print() {
System.out.println ("(" + this.x + "," + this.y + ")");
}
}
origin.print();
}
}
Obrada:
% javac OriginPrinter .java
% java OriginPrinter
(0.0, 0.0)
%
Izlaz:
% javac TwoDPoint .java
% javac OriginPrinter .java
% java OriginPrinter
(0.0,0.0)
(0.0,0.0)
(0.0,0.0)
(0.0,0.0)
(0.0,0.0)
(0.0,0.0)
%
Ili, jo bolje,
System.out.println (origin.getAsString ());
class OriginPrinter {
public static void main(String[] args) {
TwoDPoint origin;
origin = new TwoDPoint ();
origin.x = 0.0;
origin.y = 0.0;
System.out.println (origin.getAsString ());
}
}
Imamo:
% javac TwoDPoint .java
% javac OriginPrinter .java
% java OriginPrinter
(0.0,0.0)
%
Setter metode
Takoder poznatei kao mutator metode, ove metode samo postavljajuvrijednosti
varijabli(obicnoprivatnih) unutarklase.
class TwoDPoint {
double x;
double y;
void print() {
System.out.println ("(" + this.x + "," + this.y + ")");
}
void print(int n) {
for (int i = 0; i < n; i++) {
System.out.println ("(" + this.x + "," + this.y + ")");
}
}
String getAsString () {
return "(" + this.x + "," + this.y + ")";
}
void setX(double value) {
this.x = value;
}
void setY(double value) {
this.y = value;
}
}
class OriginPrinter {
public static void main(String[] args) {
TwoDPoint origin;
origin = new TwoDPoint ();
origin.setX(0.0);
origin.setY(0.0);
System.out.println (origin.getAsString ());
}
}
Imamoopet:
% javac TwoDPoint .java
% javac OriginPrinter .java
% java OriginPrinter
(0.0,0.0)
%
Getter metode
Takoder poznatei kao accessor metode, ove metode samo vracajuvrijednostivarijebli
unutarklase.
class TwoDPoint {
double x;
double y;
void print() {
System.out.println ("(" + this.x + "," + this.y + ")");
}
void print(int n) {
for (int i = 0; i < n; i++) {
System.out.println ("(" + this.x + "," + this.y + ")");
}
}
String getAsString () {
return "(" + this.x + "," + this.y + ")";
}
void setX(double value) {
this.x = value;
}
void setY(double value) {
this.y = value;
}
double getX() {
return this.x;
}
double getY() {
return this.y;
}
}
class OriginPrinter {
public static void main(String[] args) {
TwoDPoint origin;
origin = new TwoDPoint ();
origin.setX(0.0);
origin.setY(0.0);
System.out.println ("(" + origin.getX() + "," + origin.getY
() + ")");
}
}
Jo jednom:
% javac TwoDPoint .java
% javac OriginPrinter .java
% java OriginPrinter
(0.0,0.0)
%
String getAsString () {
return "(" + this.x + "," + this.y + ")";
}
void setX(double value) {
this.x = value;
}
void x(double value) {
this.x = value;
}
void setY(double value) {
this.y = value;
}
void y(double value) {
this.y = value;
}
double getX() {
return this.x;
}
double x() {
return this.x;
}
double getY() {
return this.y;
}
double y() {
return this.y;
}
}
Jo jednom:
Konstruktori
Konstruktorislueza instanciranjeklasa, dakle kreiranjeobjekata koji su instanceneke
klase. To su posebne metode koje imajuisto imekao njihovaklasa i ne vracajunikakvu
vrijednost. Npr.:
class TwoDPoint {
double x;
double y;
TwoDPoint (double xvalue, double yvalue) { // konstruktor sa
dva argumenta
this.x = xvalue;
this.y = yvalue;
}
void print() {
System.out.println ("(" + this.x + "," + this.y + ")");
}
void print(int n) {
for (int i = 0; i < n; i++) {
System.out.println ("(" + this.x + "," + this.y + ")");
}
}
String getAsString () {
return "(" + this.x + "," + this.y + ")";
}
void setX(double value) {
this.x = value;
}
void x(double value) {
this.x = value;
}
void setY(double value) {
this.y = value;
}
void y(double value) {
this.y = value;
}
double getX() {
return this.x;
}
double x() {
return this.x;
}
double getY() {
return this.y;
}
double y() {
return this.y;
}
}
Izlaz:
% javac TwoDPoint .java
% javac OriginPrinter .java
% java OriginPrinter
(0.0,0.0)
%
this.x = x;
}
}
Polja
Polje je kolekcijavarijabliistogtipa. Npr. args[] u main() metodije polje objekata
tipa String .
Zamislimoklasukoja broji pojavljivanjaznamenaka0-9. Pretpostavimoda elimo
testiratida lije raspodjelabrojeva koje generirageneratorslucajnihbrojeva doista
uniformna.Ako jest, sve znamenkabi trebaleimatipriblinoistufrekvencijunakon duljeg
vremena.
Napravitcemo polje ndigits od 10 elemenata. Nultielementce pratitibroj
pojavljivanjanula, prvielementbroj pojavljivanjajedinicaitd. Koristitcemo klasu
java.util.Random . Za generiranjeslucajnihbrojeva koristitcemo metodu
nextDouble () izte klase.
import java.util.Random;
class RandomTest {
public static void main (String args[]) {
int[] ndigits = new int[10];
double x;
int n;
Random myRandom = new Random();
for (int i = 0; i < 10; i++) {
ndigits [i] = 0;
}
// inicijaliziranje polja
// testiranje generatora
// novi slucajni broj
// pretvaranje u cijeli
// biljezimo pojavu
}
}
}
Ispis moeizgledatiotprilikeovako:
% javac RandomTest .java
% java RandomTest
0: 9967
1: 9808
2: 10069
3: 10057
4: 9984
5: 9932
6: 10004
7: 10128
8: 9952
9: 10099
%
Drugo predavanje
proceduralna sintaksa
Primitivni tipovi podataka operatori razmak literali identifikatori kljucne
rijeci separatori zbrajanje cijelih brojeva zbrajanje brojeva tipa double
mnoenje i dijeljenje neocekivani kvocijenti racunanje ostatka , modulo
prioritet izvravanja operatora zagrade mijeanje tipova podataka automatsko
dodjeljivanje tipova podataka (casting ) pretvaranje stringova u brojeve podaci
tipa char Unicode naredbe za kontrolu toka naredba if ispitivanje jednakosti
klauzula else klauzula else if while petlja for petlja do while petlja
booleovski podaci relacijski operatori prioritet izvravanja relacijskih operatora
ispitivanje jednakosti objekata naredba break naredba continue labelirane
petlje naredba switch-case kondicionalni operator (? :) logicki operatori
prioritet izvravanja logickih operatora deklariranje polja kreiranje polja
inicijaliziranje polja metoda System.arraycopy () deklariranje , alociranje i
inicijaliziranje dvodimenzionalnih polja viedimenzionalna i neuravnoteena polja
Operatori
Operator
Akcija
+
Zbrajanjebrojeva, konkatenacijastringova
+=
Zbrajanjei pridruivanjebrojeva, konkatenacijai pridruivanjestringova
Oduzimanje
-=
Oduzimanjei pridruivanje
*
Mnoenje
*=
Mnoenjei pridruivanje
/
Dijeljenje
/=
Dijeljenjei pridruivanje
|
BitovskiOR
|=
BitovskiOR i pridruivanje
^
BitovskiXOR
^=
BitovskiXOR i pridruivanje
&
BitovskiAND
&=
BitovskiAND i pridruivanje
%
Modulo(racunanjeostatka)
%=
Moduloi pridruivanje
>
Vece
>=
Vece ilijednako
<
manje
<=
Manje ilijednako
!
booleovskiNOT
!=
razlicito
++
Povecavanjeza jedan
-Smanjivanjeza jedan
>>
Shift pomak bitovau desno, zajednosa znakom
>>=
Shift pomak bitovau desno, zajednosa znakomi pridruivanje
<<
Shift pomak bitovau lijevo
<<=
Shift pomak bitovau lijevoi pridruivanje
>>>
Neoznacenibitovskishiftu desno
>>>=
Neoznacenibitovskishiftu desno i pridruivanje
&&
BooleovskiAND
||
BooleovskiOR
==
Booleovskajednakost
=
Pridruivanje
~
BitovskiNOT
?:
Uvjet
instanceof Provjera tipa
Literali
Literalitipa String oznacavajuse dvostrukimnavodnicima,npr HelloWorld!.
Takoder, dva + dva je isto to i dvadva . Navodnici, medutimnisu dio literala.
Vrijednostliterala HelloWorld! je HelloWorld!, a ne HelloWorld!. Takoder
formatiranjeznakovanemautjecajana vrijednoststringa, dakle Hello World! je isto
to i HelloWorld!.
Literalitipa char oznacavajuse jednostrukimnavodnicimai smijusadravatitocno jedno
slovo, npr. c je literaltipa char cija vrijednostje slovoc.
Identifikatori
Identifikatori su imenavariabli, metoda, klasa, paketa i sucelja. Za razlikuod literalato
nisusame stvarinego nacinnjihovogreferenciranja. U programuHelloWorldidentifikatori
su HelloWorld , String , args , main i System.out.println .
Identifikatorimorajubitisastavljeniod slova, brojeva i znakova_ (underscore) i $
(dollarsign). Pocetno slovoidentifikatorasmijebitisamo slovo, _ ili$. Mala i velikaslova
se razlikuju. Ime ne moesadravatirazmak.
Ovo su primjerilegalnihvarijabliu Javi:
MyVariable
myvariable
MYVARIABLE
x
i
_myvariable
$myvariable
_9pins
andros
OReilly
This_is_a_very_long_variable _name
Sljedecihnekolikoprimjeranisu valjanaimenavarijabli:
My Variable // sadrzi razmak
9pins // pocinje brojem
a+c // + nije alfanumericki znak
testing 1-2-3 // - nije alfanumericki znak
O'Reilly // ' nije alfanumericki znak
OReilly _&_Associates // & nije alfanumericki znak
Kljucne rijeci
Keyword
Purpose
abstract
Deklariraapstraktnuklasuilimetodu
boolean
Deklarirabooleovskuvarijabluilipovratnitip (returntype)
break
Prijevremeniizlazakizpetlje
byte
Deklarirabyte varijabluilipovratnitip
case
Jedna od granau naredbiswitch
catch
Obrada iznimke
char
deklarirachar variabluilipovratnitip
class
Oznacavapocetak definiranjaklase
continue
Prijevremenipovratak na pocetak petlje
default
default akcija za switchnaredbu
Do
Pocetak do whilepetlje
double
deklariradouble variabluilipovratnitip
Else
Oznacavadio koda koji se izvravaako uvjetu if naredbinijeistinit
extends
Oznacavada je promatranaklasa potklasa neke drugeklase
Deklarirada klasa ne moeimatipodklasuilida varijablailimetoda ne
Final
moebit pregaena
finally
Deklarirablok koda koji ce garantiranobitiizveden
Float
deklarirafloat variabluilipovratnitip
For
Pocetak for petlje
If
Izvravakod ako je uvjetistinit
implements
Deklarirada promatranaklasa implementiradano sucelje
import
Doputa pristupklasiiligrupiklasa unutarpaketa
instanceof
Ispitujeda lije objekt instancaneke klase
Int
deklariraint (integer) variabluilipovratnitip
interface
Oznacavapocetak definiranjasucelja
Long
deklariralong (longinteger) variabluilipovratnitip
native
Deklarirada je metoda implementiranau drugomprogramskomjeziku
New
Alociranoviobject
Definirapaket kojemupripada datoteka sa promatranimizvornim
package
kodom
private
Deklarirametoduilimembervarijablukao privatnu
protected
Deklariraklasu, metoduilimembervarijablukao zaticenu
public
Deklariraklasu, metoduilimembervarijablukao javnu
return
Vraca vrijednostizmetode
Short
deklarirashort (short integer) variabluilipovratnitip
static
Deklarirada varijablailimetoda pripada klasi, a ne objektu
Super
Referencana roditeljapromatranogobjekta
switch
Ispitujeistinitostnekolikomogucihuvjeta
synchronized Oznacavada je promatranidio koda osjetljivna threadove
this
throw
throws
transient
try
void
volatile
while
Separatori
Separatoripomauu definiranjustructureprograma. U programuHelloWorldkoristese
zagrade, ( ), viticastezagrade, { }, tocka, ., tocka-zarez, ;.
Separator
()
{}
[]
;
,
.
:
Svrha
Zatvaraargumenteu definicijamai pozivimametoda; podeava prioritete
izvravanjau aritmetickimizrazima; okruujeumjetnopretvorenetipove
podataka (cast types); izdvajauvjetneizrazeu naredbamaza kontrolutoka
Definirablokovekoda; automatskiinicijalizirapolja
Deklarirapolje tipova; izdvajavrijednostielemenatapolja
Zavravanaredbu
Razdvajananizaneidentifikatoreu deklaracijamavarijabli; ulancavanaredbe
u uvjetnomdijelufor petlje
Selektiravarijabluilimetodunekog objekta; separiraimenapaketa od imena
podpakete i imenaklasa
Koristise nakon labelau petljama
int i = 1;
int j = 2;
int k;
System.out.println ("i je " + i);
System.out.println ("j je " + j);
k = i + j;
System.out.println ("i + j je " + k);
k = i - j;
System.out.println ("i - j je " + k);
}
}
Evo rezultata:
%
%
x
y
x
x
Mnoenje i dijeljenje
Operatori mnoenjai dijeljenjasu * (mnoenje) i / (dijeljenje).
class MultiplyDivide {
public static void main (String args[]) {
int i = 10;
int j = 2;
int k;
System.out.println ("i je " + i);
System.out.println ("j je " + j);
k = i/j;
System.out.println ("i/j je " + k);
k = i * j;
System.out.println ("i * j je " + k);
}
}
Rezultat:
% javac MultiplyDivide .java
% java MultiplyDivide
i je 10
j je 2
i/j je 5
i * j je 20
%
Neocekivani kvocijenti
2/3 = 0
3/2 = 1
1/0 = ArithmeticException
0/0 = ArithmeticException
1.0/0.0 = Inf
1.0/0 = Inf
Izlaz:
% javac Remainder .java
% java Remainder
i je 10
j je 3
i%j je 1
%
Sljedeciprogramracunaenergijuekvivalentnumasijednogelektronauz pomoc
EinsteinoveformuleE = mc2.
class mc2 {
public static void main (String args[]) {
double mass = 9.1096E-25;
double c = 2.998E8;
double E = mass * c * c;
System.out.println (E);
}
}
Izlaz:
% javac mc2.java
% java mc2
8.18771e-08
%
Zagrade
Zagradese koristeza mijenjanjeuobicajenogredosljedaoperacija. Sljedeciprimjer
pokazujepretvaranjeFahrenheitovihstupnjevau Celsiusovepo formuliC = (5/9) (F 32) gdje su C stupnjeviCelsiusaa F stupnjeviFahrenheita. Programispisujetablicu
konverzijaizmedu0 i 300 stupnjevaFahrenheitaza svakih20 stupnjeva.
// Ispisuje tablicu konverzije Fahrenheita u Celsiuse
class FahrToCelsius
Obrada i izlaz:
% javac FahrToCelsius .java
% java FahrToCelsius
0.0 F = -17.77777777777778 C
20.0 F = -6.666666666666667 C
40.0 F = 4.444444444444445 C
60.0 F = 15.555555555555557 C
80.0 F = 26.666666666666668 C
100.0 F = 37.77777777777778 C
120.0 F = 48.88888888888889 C
140.0 F = 60.0 C
160.0 F = 71.11111111111111 C
180.0 F = 82.22222222222223 C
200.0 F = 93.33333333333334 C
220.0 F = 104.44444444444444 C
240.0 F = 115.55555555555556 C
260.0 F = 126.66666666666667 C
280.0 F = 137.77777777777777 C
300.0 F = 148.88888888888889 C
%
+ x je " + k);
* x je " + k);
- x je " + k);
- i je " + k);
/ x je " + k);
/ i je " + k);
}
}
Izlaz:
%
%
i
x
i
i
i
x
i
x
double mass;
double c = 2.998E8;
double E;
// meters/second
Obrada i rezultati:
% javac mc2.java
% java mc2 0.0456
4.098529824 E15 Joules
%
Primijetiteda ne bi bilodovoljnostaviti
Mass = Double.valueOf (args[0]); // izostavljena je metoda
doubleValue ()
\b backspace
\t tab
\n linefeed
\f formfeed
\r carriagereturn
\" Dvostrukinavodnici, "
\' Jednostrukinavodnici, '
\\ backslash, \
Escape sekvencaza dvostrukenavodnikekoristise uglavnomu stringovimagdje bi
pojava navodnikainaceterminiralastring. Npr.
System.out.println ("And then Jim said, \"Who's at the door?\"");
Unicode
Java koristiUnicodeskup znakova. Unicodeje dvobajtniznakovnikod koji reprezentira
gotovosve znakoveu gotovosvimalfabetimai pismovnimsustavimasvijeta, ukljucujuci
engleski, arapski, kineskii druge. Problemje, medutim, to mnogioperacijskisustavii
web preglednicine podravajuUnicode. Java ce uglavnompravilnotretiratiinputneUnicodeznakova. Prvih128 znakovau Unicodetabliciidenticnisu sa uobicajenim
ASCII znakovima. Drugih128 znakovapodudara se sa gornjih128 znakovau ISO
Latin1 proirenomASCII skupu. Ostalih65,280 predstavljaproblem.
PojedinacneUnicodeznakovemoetereferenciratikoristeciescape sekvancu\u izkoje
slijedicetverocifreniheksadecimalnibroj. Npr.
\u00A9
\u0022
\u00BD
\u0394
\u00F8
"
1/2
Znak za copyright
Dvostrukinavodnici
Razlomak
Velikogrcko delta
Malo o prekrienoznakomslash
if
else
else if
while
for
do while
switch case
break
continue
Primijetiteda je goto
je rezerviranarijecalinijeimplementirana
. O obradi iznimakabit
ce rijecikasnije.
Naredba if
Primijetimoda smo se u klasi emc2 koristiliargumentoms komandnelinije, alinismo
provjeravalije lion uopce uneen. Sljedeciprogramispisujeprviargumentsa komandne
linije, aliprvo uz pomoc varijablearrayname .length provjeravaimaliargumenata.
class Hello {
public static void main (String args[]) {
if (args.length > 0) {
System.out.println ("Hello " + args[0]);
}
}
}
System.out.println (args[0]) je ovdje umetnutaunutartesta, if (args.length
> 0) { }. Blok koda unutarviticastihzagrada, System.out.println (args[0]), bit
javac Hello.java
java Hello
java Hello world!
Hello world!
Ispitivanje jednakosti
Testiranjejednakostije neto sloenije. Ocekivalibiste da se za ispitivanjejesu lidva
broja jednakikoristiznak jednakosti=. Medutim, on je rezerviranza operator
Da bi to izbjegli, nekiprogrameripiutestiranjeuvjetaovako:
boolean b = true;
if (false = b) {
System.out.println ("b is false");
}
Klauzula else
class Hello {
public static void main (String args[]) {
if (args.length > 0) {
System.out.println ("Hello " + args[0]);
}
else {
System.out.println ("Hello whoever you are.");
}
}
}
%
%
%
%
%
%
%
javac Hello.java
java Hello
Hello whoever you are
java Hello world!
Hello world!
Klauzula else if
Naredba if nijeogranicenana samo dva slucaja. Kombiniranjemelse i if dobije se
else if kako bi se mogleispitatisve mogucnosti
. Preradimosada Helloprogramtako
da barata sa 4 imenas komandnelinije.
class Hello {
public static void main (String args[]) {
if (args.length == 0) {
System.out.println ("Hello whoever you are");
}
else if (args.length == 1) {
System.out.println ("Hello " + args[0]);
}
else if (args.length == 2) {
System.out.println ("Hello " + args[0] + " " + args[1]);
}
else if (args.length == 3) {
System.out.println ("Hello " + args[0] + " " + args[1] + "
" + args[2]);
}
else if (args.length == 4) {
System.out.println ("Hello " + args[0] +
" " + args[1] + " " + args[2] + " " + args[3]);
}
else {
System.out.println ("Hello " + args[0] + " " + args[1] + "
" + args[2]
+ " " + args[3] + " and all the rest!");
}
}
}
%
%
%
%
%
%
%
%
%
%
javac Hello.java
java Hello
Hello whoever you are
java Hello prvi drugi treci cetvrti
Hello prvi drugi treci cetvrti
java Hello prvi drugi treci cetvrti peti
Hello prvi drugi treci cetvrti and all the rest!
while petlja
class Hello {
public static void main (String args[]) {
int i;
System.out.print("Hello ");
// Ispis Hello
i = 0;
prolaza kroz petlju
while (i < args.length) {
System.out.print(args[i]);
System.out.print(" ");
i = i + 1;
}
System.out.println ();
}
// Inicijaliziramo brojac
// Testiramo i iteriramo
}
%
%
%
%
%
%
%
javac Hello.java
java Hello
Hello
java Hello prvi drugi treci cetvrti
Hello prvi drugi treci cetvrti
for petlja
class Hello {
public static void main (String args[]) {
System.out.print("Hello ");
// Ispis Hello
for (int i = 0; i < args.length; i = i + 1) { // Testiramo i
iteriramo
System.out.print(args[i]);
System.out.print(" ");
}
System.out.println ();
// Zavrsimo
liniju
}
}
%
%
%
%
%
%
%
javac Hello.java
java Hello
Hello
java Hello prvi drugi treci cetvrti
Hello prvi drugi treci cetvrti
i = i+1, j = j-1)
i = i-1, j = j-1)
do while petlja
class Hello {
public static void main (String args[]) {
int i = -1;
do {
if (i == -1) System.out.print("Hello ");
else {
System.out.print(args[i]);
System.out.print(" ");
}
i = i + 1;
} while (i < args.length);
System.out.println ();
}
}
%
%
%
%
%
%
%
javac Hello.java
java Hello
Hello
java Hello prvi drugi treci cetvrti
Hello prvi drugi treci cetvrti
Booleovski podaci
Svaka booleovskavarijablamoepoprimitijednuod dvijevrijednostitrue ilifalse .
Primijetiteda te vrijednostinisuisto to i String ovi"true" i "false", a nisuninumericke
vrijednostikao 1 i 0. Takoder primijetiteda su rijecitrue i falserezerviranerijeciu Javi,
nazivajuse booleovskiliteralii osjetljivesu na velikai malaslova.
boolean test1 = true;
boolean test2 = false;
Relacijski operatori
Java ima6 relacijskihoperatora koji usporedujudva broja i vracajubooleovsku
vrijednost. To su <, >, <=, >=, ==, i !=.
Manje
True ako je x manjeod y, inacefalse.
> y Vece
True ako je x iveceod y, inacefalse.
<= y Manje ilijednako True ako je x manjeilijednako y, inacefalse.
>= y Vece ilijednako True ako je x vece ilijednako + y, inacefalse.
== y Jednako
True ako je x jednako y, inacefalse.
!= y Nejednako
True ako je x razlicitood y, inacefalse.
x < y
x
x
x
x
x
Sljedeciprimjerikoda pokazjuuporaburelacijskihoperatora:
boolean
boolean
boolean
boolean
boolean
boolean
boolean
boolean
test1
test2
test3
test4
test5
test6
test7
test8
=
=
=
=
=
=
=
=
1 < 2;
// True
1 > 2;
// False
3.5 != 1;
// True
17*3.5 >= 67.0 - 42; // True
9.8*54 <= 654;
// True
6*4 == 3*8;
// True
6*4 <= 3*8;
// True
6*4 < 3*8;
// False
Vidjetcete da je rezultat(neocekivano):
Stringovi nisu jednaki .
Naredba break
Naredba break uzrokujeizlazakizpetljeprije nego to uvjetza ulazaku sljede u iteraciju
postane la an. Na primjer, u sljedecojvarijantiprograma CountWheat koji racuna
parcijalnesumereda Si=1, ,64(2i) pri cemuse ispisujeporuka o pogrekii for
petljase prekida cimnastaneoverflow pa (2i) postane negativan.
class CountWheat
Pogledajmoobradu i izlaz:
% javac CountWheat .java
% java CountWheat
2
6
62
126
1022
2046
16382
32766
262142
524286
4194302
8388606
67108862
134217726
1073741822
2147483646
Gotovo!
%
14
30
254
510
4094
8190
65534
131070
1048574
2097150
16777214
33554430
268435454
536870910
Overflow : grains = -2147483648
Naredba continue
Naredba continue vraca kontroluna pocetak najblieunutarnjepetljekojom je
obuhvacena, ne izvravajucipri tom ostatak naredbiu tijelupetlje. Ako je to for petlja,
brojac se inkrementira.Sljedeciprimjerpokazujekako se moepreskocitiobrada parnih
elemenatau polju:
for (int i = 0; i < m.length; i++) {
if (m[i] % 2 == 0) continue ;
// obrada neparnih elemenata ...
}
Labelirane petlje
U praviluunutarugnjijedenihpetljinaredbe break i continue uzrokujunapu tanje
najunutarnjijepetljekoja ihobuhva a. Pogledajtesljedeciprimjerdvijeugnijedene
petlje:
for (int i=1; i < 10; i++) {
for (int j=1; j < 4; j++) {
if (j == 2) break;
System.out.println (i + ", " + j);
}
Rezultatizvravanjabio bi
1,
2,
3,
4,
5,
6,
7,
8,
9,
1
1
1
1
1
1
1
1
1
Sada bi rezultatizvravanjabio
1, 1
Naredba switch-case
Switch-case naredba je zapravokraticaza odredene vrste ifnaredbi.
sljedecinizif naredbikoje se sve odnose na istuvelicinu:
Pogledajmo
if (x == 0) doSomething 0();
else if (x == 1) doSomething 1();
else if (x == 2) doSomething 2();
else if (x == 3) doSomething 3();
else if (x == 4) doSomething 4();
else doSomethingElse ();
doSomething 2();
break;
case 3:
doSomething 3();
break;
case 4:
doSomething 4();
break;
default :
doSomethingElse ();
}
Kondicionalni operator (? :)
Vrijednostneke varijablecesto ovisisamo o tome je lineka booleovskavarijablaistinita
iline. Npr. jedna od uobicajenihoperacijaje traenjemaksimumaizmedudvije
vrijednostii pridruivanjete velicinenekoj varijabli:
if (a > b) {
max = a;
}
else {
max = b;
}
Logicki operatori
Do sada uvedenirelacijskioperatori(<, <=, >, >=, !=) dovoljnisu za testiranje
pojedinacnoguvjeta.Za ispitivanjeviestrukihuvjeta, moralibismokoristitivie if
naredbi:
if (x == 2) {
if (y != 2) {
System.out.println ("Oba uvjeta su true.");
}
}
b;
2 || 5 < 7; // b je true
3 || 5 < 7; // b je i dalje true
3 || 5 > 7; // now b je false
d;
// b je false
// c je true
// d je false
*, /, % Multiplikativni
operatori
+, - Aditivnioperatori
<, >, >=, <= Relacijskioperatori
==, != Usporedbe jednakostii nejednakosti
& Bitovskiand
| Bitovskior
&& Logickiand
|| Logickior
? : Kondicionalnioperator
= Operator pridruivanja
Deklariranje polja
Polja morajuimatiodredenitip, npr. byte , int , String ilidouble . Samo varijable
odgovarajucegtipa mogubitispremljeneu isto polje. Jedno polje ne moeistodobno
sadravatirecimobrojeve i stringove. Polja morajukao i ostale varijablebitideklarirana.
Deklarirajuse dodavanjemuglatihzagrada [] kao sufikstipuvarijable. Na primjer:
int[] k;
float[] yt;
String[] names;
Ovo znacida je k polje int -ova, yt polje float -a, a names polje String -ova. Uglate
zagrademoetepo vlastitomizborudodati i varijabliumjestotipuilicak jednomi drugom.
int k[];
float yt[];
String names[];
int[] k[];
float[] yt[];
String[] names[];
Kreiranje polja
Deklarirajucipolje samo smo reklikoje vrste vrijednostice polje sadravati. Timega jo
nismokreirali. Polja se kao i ostaliobjektiu Javikreirajupomocukljucnerijecinew.
Varijablekoje smo maloprijedeklariralimoemokreiratiovako:
k = new int[3];
yt = new float[7];
names = new String[50];
brojeva tipa float , a polje names moesadrati50 String -ova. Ovaj se korak
ponekad nazivaalociranjempolja jer se njimeizdvajapotrebna memorijaza polje.
Inicijaliziranje polja
Pojedinacnekomponentepolja referencirajuse imenompolja i cijelimbrojem koji
predstavljapozicijukomponenteunutarpolja. Ovi se brojevinazivajusubskriptimaili
indeksima komponentiu polju. Indeksisu cijelibrojevipoceviod 0 (nula). Dakle gore
deklariranopolje k imakomponentek[0], k[1] i k[2]. Buducida se pocinjeod nule,
ne postoji k[3]. Pokuaj referenciranjanepostojecekomponenterezultiratce
odbacivanjemiznimkeArrayIndexOutOfBoundsException . Komponentepolja mogu
se upotrebljavatikao i drugevarijablekoje nisukomponentepolja.
k[0] = 2;
k[1] = 5;
k[2] = -2;
yt[17] = 7.5f;
names[4] = "Fred";
Primijetimoda ce brojevitipa int kad budu spremljeniu ovo polje postati float jer je
polje tako deklarirano.
Metoda System.arraycopy()
Kopiranjepolja nijenekiteak zadatak, alije efikasnijeako je implementiranou samom
sustavu. Zato java.lang.System sadristatickumetodu System.arraycopy () koju
moetekoristitiza kopiranjejednogpolja u drugo. Definiranaje ovako:
public static void arraycopy (Object source, int sourcePosition ,
Object destination , int destinationPosition , int numberOfElements )
Deklariranje, alociranje i
inicijaliziranje dvodimenzionalnih
polja
Dvodimenzionalnapolja se deklariraju, alocirajui inicijaliziraju
slicnokao
jednodimenzionalna
. Specificiratcete dvijedimenzijeumjestojedne i vjerojatnokoristiti
dvijeugnijedenepetlje. U sljedecemprimjeruse svakomelementudvodimenzionalnog
polja dodjeljujesumanjegovihindeksa.
class FillArray {
public static void main (String args[]) {
int[][] matrix;
matrix = new int[4][5];
for (int row=0; row < 4; row++) {
for (int col=0; col < 5; col++) {
matrix[row][col] = row+col;
}
}
}
}
id[row][col] = 1.0;
}
}
}
}
}
U dvodimenzionalnom
poljuiznimkaArrayIndexOutOfBoundsException pojavljuje
se kad god prekoracitemaksimalniindeksbilopo recimabilopo stupcija.
Dvodimenzionalnopolje moetetakoder deklarirati, alociratii inicijalizirati
u jednom
koraku, zadajucilistuinicijalnihvrijednostiunutarugnijedenihviticastihzagrada. Npr.
jedinicna3x3 matricamoese zadatiovako:
double[][] ID3 = {
{1.0, 0.0, 0.0},
{0.0, 1.0, 0.0},
{0.0, 0.0, 1.0}
};
Viedimenzionalna polja i
neuravnoteena polja
Ne moratese ogranicavatina dvodimenzionalnapolja. Java dopzta polja od 3, 4 ilivie
dimenzija. Ipak, ako trebate vieod 3 dimenzijeza polje, vjerojatnokoristitepogrenu
strukturupodataka. Cak su i trodimenzionalnapolja rijetkaosimu programimaza
znanstvenei inenjerskeaplikacije.
Sintaksaza trodimenzionalnapolja je direktnaekstenzijasintakseza dvodimenzionalna
.
Sljedeciprogramdeklarira, alocirai inicijalizirajedno trodimenzionalnopolje. U svaki
elementspremljenaje sumanjegovihindeksa.
class Fill3DArray {
public static void main (String args[]) {
int[][][] M;
M = new int[4][5][3];
for (int row=0; row < 4; row++) {
for (int col=0; col < 5; col++) {
for (int ver=0; ver < 3; ver++) {
M[row][col][ver] = row+col+ver;
}
}
}
}
}
Trece predavanje
objekti i klase
c.licensePlate
c.speed
c.maxSpeed
Ovaj programne zahtijevasamo klasu CarTest nego takoder i klasu Car . Da biste ga
mogliizvriti, staviteklasu Car u datoteku Car.java ., a klasu CarTest u datoteku
CarTest .java . Obje datoteke neka budu u istomdirektoriju. Kompilirajteobje
datoteke na uobicajeninacini na kraju izvriteCarTest .
% javac Car.java
% javac CarTest .java
% java CarTest
New York A45 636 se krece brzinom od 70.0 kilometara na sat.
%
Primijetiteda klasa Car nema main() metodu, dakle ne moeteje izvriti. Ona postoji
jedinotako da je pozivajudrugiprogramikoji imajuvlastitemain() metode.
Mnoge aplikacijekoje cete pisatikoristitce vieklasa. Uobicajenoje da se svaka klasa
staviu svojuvlastitudatoteku. Uskoro cete naucitikoristitii pakete (packages) kako
biste mogliorganiziratisvoje cesto koriteneklase unutarrazlicitihdirektorija. Za sada
dritesve datoteke sa izvornimprogramima(*.java) kao i one sa kompiliranim
programima(*.class) unutarjednogdirektorija. Iako smo kompiliraliobje klase
odvojeno, dovoljnobi bilokompiliratisamo klasu CarTest jer ce kompajlervec sam
pronaciklasu Car .
Inicijaliziranje atributa
Atributise mogu(i najcece trebaju) inicijalizirati
odmahcimsu deklarirani, isto kao i
lokalnevarijable. Klasu Car moemopreradititako da inicijaliziramo
njeneattribute
ovako:
class Car {
String licensePlate = "";
// npr. "New York 543 A23"
double speed
= 0.0;
// u kilometrima na sat
double maxSpeed
= 120.0; // u kilometrima na sat
}
Rezultatizvravanjabi bio
% javac Car.java
% javac CarTest .java
% java CarTest
se krece brzinom od 0.0 kilometara na sat.
%
Metode
Tipovipodataka ne znacemnogoako ne moetes njimanitanapraviti. Zbog toga
postoje metode. Dok atributikazjujuto klasa jest, metode kazujuto ona cini. Atribute
i metode nazivamozajednicimimenomclanovimaklase. Klase koje ste do sada
upoznaliimajuuglavnomsamo jednumetodu, main(). Medutim, opcenitoklase mogu
imatimnogorazlicitihmetoda. Na primjer, klasuCar moemosnabdjetimetodomkoja ce
simulirativonjumaksimalnombrzinom:
class Car {
String licensePlate = "";
// npr. "New York 543 A23"
double speed
= 0.0;
// u kilometrima na sat
double maxSpeed
= 120.0; // u kilometrima na sat
void floorIt () { // ubrzanje do maksimalne brzine
this.speed = this.maxSpeed ;
}
}
Atributisu ostaliistikao prije, alisad je dodana metoda koju smo nazvalifloorIt ().
Pocinjekljucnomrijecivoid to je povratnitip (return type) te metode. Svaka metoda
mora imatipovratnitip koji moebitiilivoid ilinekitip podataka kao int , byte , float ,
String , iliklasa koju ste samidefinirali
. Povratnitip pokazujevrstuvrijednostikoja ce
bitivracenapozivnojmetodinakon to se pozvanametoda izvri. Ako je povratnitip na
primjerint , onda tu metodumoetekoristitisvagdjegdje biste inacekoristililiteralili
varijablutipa int .Ako je povratnitip void , metoda ne vraca nikakvuvrijednost.
Ime ove metode je floorIt , a izanjegaslijedepraznezagrade. Kad bi ova metoda
imalaargumente, onibi se naveliunutartihzagrada. Tijelometode nalazise unutar
viticastihzagrada.
this.speed = this.maxSpeed ;
Pozivanje metoda
Izvanklase Car , metodu floorIt () pozvatcete na istinacinkao to ste referencirali
attribute, dakle navodeciimeobjekta kojeg elite ubrzati i separator ., kao to
pokazujesljedeciprimjer
class CarTest 3 {
public static void main(String args[]) {
Car c = new Car();
c.licensePlate = "New York A45 636";
c.maxSpeed = 123.45;
System.out.println (c.licensePlate + " se krece brzinom od " +
c.speed +
" kilometara na sat.");
c.floorIt ();
System.out.println (c.licensePlate + " se krece brzinom od " +
c.speed +
" kilometara na sat.");
}
}
Izlaz:
% javac Car.java
% javac CarTest 3.java
% java CarTest 3
New York A45 636 se krece brzinom od 0.0 kilometara na sat.
New York A45 636 se krece brzinom od 123.45 kilometara na sat.
%
Implicirani this
Unutarklase Car nijenunododavatiimenimaatributaprefiks this. jer se on
podrazumijeva. To je zato jer metoda floorIt () mora bitipozvanaod specificne
instanceklase Car , a ta instancazna gdje su njenipodaci. Ilidrugimrijecima, svakiobject
izklase Car imasvojuvlastitufloorIt () metodu.
class Car {
String licensePlate = "";
// npr. "New York 543 A23"
double speed
= 0.0;
// u kilometrima na sat
double maxSpeed
= 120.0; // u kilometrima na sat
void floorIt () { // ubrzanje do maksimalne brzine
speed = maxSpeed ;
}
}
}
}
class CarTest 4 {
public static void main(String args[]) {
Car c = new Car();
c.licensePlate = "New York A45 636";
c.maxSpeed = 123.45;
System.out.println (c.licensePlate + " se krece brzinom od " +
c.speed +
" kilometara na sat.");
for (int i = 0; i < 15; i++) {
c.accelerate (10.0);
System.out.println (c.licensePlate + " se krece brzinom od "
+ c.speed +
" kilometara na sat.");
}
}
}
Izlaz:
% javac Car.java
% javac CarTest 4.java
% java CarTest 4
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
%
Setter metode
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
od
od
od
od
od
od
od
od
od
od
od
od
od
od
od
od
Izlaz:
% javac Car.java
% javac CarTest 5.java
% java CarTest 5
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
New York A45 636 se krece
%
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
od
od
od
od
od
od
od
od
od
od
od
od
od
od
od
od
Getter metode
Cesto je korisnoda metoda vraca neku vrijednostonoj klasikoja ju je pozvala. To se
radi pomocukljucnerijecireturn na zavretkutijelametode te naznakompovratnog
tipa na njenompocetku. Na primjersljedecametoda getLicensePlate () vraca
trenutacnuvrijednostatributalicensePlate u klasi Car .
String getLicensePlate () {
return this.licensePlate ;
}
}
if (this.speed < 0.0) {
this.speed = 0.0;
}
}
}
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
brzinom
od
od
od
od
od
od
od
od
od
od
od
od
od
Konstruktori
Konstruktorkreira novuinstancuklase. On inicijalizirapotrebne varijablei obavljasve
poslovekoji su potrebnida bi se klasa pripremilaza uporabu. Pogledajmoprimjer:
Car c = new Car();
Uporaba konstruktora
Sljedeciprogram, CarTest 7, koristitreciod navedenihkonstruktoraza inicijaliziranje
objekata tipa Car umjestoda direktnopostavljavrijednosti.
class CarTest 7 {
public static void main(String args[]) {
Car c = new Car("New York A45 636", 123.45);
System.out.println (c.getLicensePlate () + " se krece brzinom od
" + c.getSpeed () +
" kilometara na sat.");
for (int i = 0; i < 15; i++) {
c.accelerate (10.0);
System.out.println (c.getLicensePlate () + " se krece brzinom
od " + c.getSpeed ()
+ " kilometara na sat.");
}
}
}
Ogranicenja
Mogucnostimplementiranjaogranicenjajedan je od razlogaza davanjeprednosti
koritenjukonstruktorai setter metoda pred direktnimdohvacanjemvarijabli. Na primjer,
u klasi Car vanoje osiguratida brzinanikadne bude veca od propisanemaksimalne
brzinei da nijedna ne bude manjaod nule.
Vec smo to vidjeliu primjerumetode accelerate () koja, na nacinkako je napravljena,
nece pridijelitiautomobilubrzinuvecu od propisanemaksimalnebrzine.
void accelerate (double deltaV) {
this.speed = this.speed + deltaV;
if (this.speed > this.maxSpeed ) {
this.speed = this.maxSpeed ;
}
if (this.speed < 0.0) {
this.speed = 0.0;
}
}
}
}
Promjena implementacije
Pretpostavimoda elimoprilagoditiklasu Car za uporabuu simulacijiprometavelikog
grada kao to je New York, gdje ce svakirealniautomobilna cesti bitireprezentiranpo
jednimobjektomtipa Car . To je velikakolicinaobjekata i poeljnoje smanjitikolicinu
zauzetememorije. Svakiobjekt tipa Car zauzimaoko 60 byteova, to najvieovisio
duljiniStringaza registarskuplocicu. Na numerickimvarijablamamoemoutedjeti8
byteovapo objektu ako floatumjestodouble, pri cemuce suceljeostatiisto:
class Car {
private String licensePlate ; // npr. "New York 543 A23"
private float speed;
// u kilometrima na sat
private float maxSpeed ;
// u kilometrima na sat
public Car() {
this.licensePlate = "";
this.speed = 0.0F;
this.maxSpeed = 120.0F;
}
public Car(String licensePlate , double speed, double maxSpeed ) {
this.licensePlate = licensePlate ;
this.speed = (float) speed;
if (maxSpeed > 0) this.maxSpeed = (float) maxSpeed ;
else this.maxSpeed = 0.0F;
if (speed > this.maxSpeed ) this.speed = (float) this.maxSpeed ;
if (speed < 0) this.speed = 0.0F;
else this.speed = (float) speed;
}
public Car(String licensePlate , double maxSpeed ) {
this.licensePlate = licensePlate ;
this.speed = 0.0F;
if (maxSpeed > 0) this.maxSpeed = (float) maxSpeed ;
else this.maxSpeed = 0.0F;
}
// getter (accessor ) metode
public String getLicensePlate () {
return this.licensePlate ;
}
public double getMaxSpeed () {
return this.maxSpeed ;
}
public double getSpeed () {
return this.speed;
}
Buducida je suceljeostalo isto, nijedna drugaklasa koja ovisio ovoj klasine mora se
mijenjatipa cak niponovnokompilirati
. Ovdje bismomogliicidalje pa napravitivlastitu
klasu LicensePlate koja bi doz voljavaASCII znakoveod jednogbytea umjesto
Unicodeznakovaod dva bytea i tako dalje.
Peto predavanje
appleti
Dijelovi URL-a
Protokolje uglavnomjedan od sljedecih:
file datoteka na lokalnomdisku
ftp ftp posluitelj
http World Wide Web posluitelj
https secure http, Web posluiteljsa zatitompodataka
gopher gopherposluitelj
mailto emailadresa
news Usenetnewsgroup
telnet veza na serviszasnovanna Telnet- u
WAIS WAIS posluitelj
rmi remotemethodinvocation
Linkovi
Da biste u HTML datotecinapravililinkod dijelateksta, zatvoritcete ga unutaroznaka
<A> i </A>. Oznaci <A> dodat cete atributHREF i u njemunavestiurlna koji elite
usmjeritiva link. Na primjer,
Ovaj link pokazuje na
<A HREF="http://student .math.hr/~vedris/java/java-predavanja /javapredavanje -05.htm">
peto predavanje iz Jave
</A>
na PMF-u.
Relativni URL-ovi
When a web browser reads an HTML document, it has a great deal of informationabout
the document. Thisincludesthe protocol used to retrievethe document, the nameof the
host where the documentlives, and the path to that documenton the host. Most of thisis
likelyto be the same for manyof the URLs inthat document. RelativeURLs inheritthe
protocol, hostname, and path of theirparent documentrather thanrespecifyingit ineach
<A HREF> tag. Thusifany piece of the URL is missing
, it is assumedto be the same as
that of the documentinwhichthe URL is found. Such a URL is calleda relative URL. In
contrast, a completelyspecifiedURL is calledan absoluteURL. Na primjer, ako
pregledavajucidokumenthttp://metalab .unc.edu/javafaq /books.html kliknete
na sljedecihiperlink:
to je Applet?
Appletje malaaplikacijakoja je zamiljenada se ne izvravasamostalno, nego unutar
drugeaplikacije, tipicnounutarweb browsera. Klasa java.applet.Applet osigurava
standardnosuceljeizmeduappleta i njihoveokoline. Evo to se sve nazivaappletom:
malaaplikacija
sigurniprogramkoji se izvravaunutarweb browsera
podklasa klase java.applet.Applet
instancapodklase od java.applet.Applet
Ovo je hijerarhijanjenihnadklasa:
java.lang.Object
|
+---java.awt.Component
|
+---java.awt.Container
|
+---java.awt.Panel
|
+---java.applet.Applet
Alternativni tekst
Oznaka <APPLET> imai atributALT . Browser ga koristiu slucajuako iznekog razlogane
moeizvestiapplet. Na primjer, ako je u browseruiskljucenaopcija za dozvoluizvodenja
Java appleta, trebao bi se prikazatitekst navedenu atributuALT . AtributALT je
opcionalan.
<applet code="HelloWorldApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes " width=200
height=200
ALIGN=RIGHT HSPACE=5 VSPACE=10
ALT="Hello World!">
</APPLET>
Imenovanje appleta
Appletuse unutarweb stranicemoedati imekako bi mogaokomuniciratis drugim
appletima. To se radi pomocuatributaNAME . Na primjer,
<applet code="HelloWorldApplet .class" Name=Applet_01
CODEBASE ="http://student .math.hr/~vedris/java/classes " width=200
height=200
ALIGN=RIGHT HSPACE=5 VSPACE=10
ALT="Hello World!">
Hello World!<P>
</APPLET>
JAR arhive
Sve slike, zvukovei klase koje su potrebne za izvravanjevaegappleta moetespakirati
u JAR arhivui tako ihucitatiodjednom, a ne svaku posebno. Timesmanjujetebroj
konekcijakoje browser mora ostvaritida bi dobio sve to mutreba. Ako se appletova
klasa nalaziu takvoj arhivi, onda cete oznaci<APPLET> dodati jo i atribut<ARCHIVE >.
Na primjer:
<APPLET CODE=HelloWorldApplet
CODEBASE ="http://student .math.hr/~vedris/java/classes " WIDTH=200
HEIGHT=200
ARCHIVE ="HelloWorld .jar">
<hr>
Hello World!
<hr>
</APPLET>
Velicina appleta
Velicinaprostora koju zauzimaapplet dok se izvravaunutarweb browsera zadanaje
atributimaHEIGHTi WIDTH i sam applet je ne moepromijeniti
. Medutim, moe
doznatikolikaje ta velicina, to muje potrebno npr. da ne bi crtao izvanzadanog
prostora.
Velicinaappleta doznajese pomocumetode getSize () koju klasa
java.applet.Applet nasljedujeod svoje nadklase java.awt.Component . Ova
metoda vraca objekt tipa java.awt.Dimension . Takav objekt imadva atributatipa
int , to su height i width . Pogledajmosljedeciprimjerappleta koji ispisujesvoje
dimenzije.
import java.applet.*;
import java.awt.*;
</HEAD>
<BODY>
Ovo je applet DrawStringApplet :<P>
<APPLET code="DrawStringApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH="300" HEIGHT="50">
<PARAM name="Message " value="Kako ste?">
Ova stranica ce biti vrlo dosadna ako va browser ne razumije Javu.
</APPLET>
</BODY>
</HTML>
</APPLET>
</BODY>
</HTML>
Sigurnost appleta
Suprotnorairenommiljenju,Java appletisu sigurniza korisnikekoji surfajupo
internetu. Nece vamse dogoditida vamapplet formatiradisk iliunesevirusu sustav.
Zbog mehanizamavirtualnemaine, hvatanjaiznimakai tako dalje, Java appletii
aplikacijesu u praksi sigurnijiod tradicionalnihprogramskihjezika.
Appletiimajuugradenadodatna sigurnosnaogranicenjakako bi zatitilikorisnikeod
programerskihpogreaka, alii od virusa. To je implementiranopomocuklase
java.lang.SecurityManager . Razlicitepodklase ove klase osiguravajurazlicita
sigurnosnaokruenjana razlicitimvirtualnimmainama. Loa strana toga je uvodenje
raznihrestrikcijana akcije koje aplet moeciniti.
9.
10.
Koordinatni sustav
Java korististandardni, dvodimenzionalni
sustavza racunalnugrafiku. Prvividljivipikselu
gornjemlijevomkutuappletovepodlogeje tocka (0, 0). Koordinatese povecavaju
prema desno i prema dolje.
Crtanje linija
x1,
y1,
x2,
y2)
Pozivase ovako:
g.drawLine (x1, y1, x2, y2)
Pri tome su (x1, y1) i (x2, y2) krajnjetocke linije, a g je objekt tipa Graphics
pomocukojeg crtate. Pogledajmoprogramkoji ce nacrtatilinijudijagonalnopreko
appleta.
import java.applet.*;
import java.awt.*;
public class SimpleLine extends Applet {
public void paint(Graphics g) {
g.drawLine (0, 0, this.getSize ().width, this.getSize ().height);
}
}
<APPLET code="SimpleLine .class"
HEIGHT="50" WIDTH="100">
CODEBASE ="http://student .math.hr/~vedris/java/classes "
</APPLET>
Crtanje pravokutnika
Pravokutnikcrtate pomocuobjekta g izklase Graphics i metode drawRect () cija je
signatura:
public void drawRect (int
int
int
int
x,
y,
width,
height)
Pozivase ovako:
public void drawRect (x, y, width, height)
import java.applet.*;
import java.awt.*;
public class RectangleApplet extends Applet {
public void paint(Graphics g) {
g.drawRect (0, 0, this.getSize ().width - 1, this.getSize ()
.height - 1);
}
}
<APPLET code="RectangleApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
HEIGHT="50" WIDTH="40">
</APPLET>
Punjenje pravokutnika
Metoda drawRect () crta prazanpravokutnik. Ako ga eliteispuniti, koristitemetodu
fillRect () cija je signatura:
public abstract void fillRect (int
int
int
int
x,
y,
width,
height)
appletHeight
appletWidth
rectHeight
rectWidth
rectTop
rectLeft
=
=
=
=
=
=
this.getSize ().height;
this.getSize ().width;
appletHeight /3;
appletWidth /3;
(appletHeight - rectHeight )/2;
(appletWidth - rectWidth )/2;
Brisanje pravokutnika
Nacrtanipravokutnikmoese izbrisatimetodom clearRect () cija je signatura:
public abstract void clearRect (int
int
int
int
x,
y,
width,
height)
appletHeight
appletWidth
rectHeight
rectWidth
rectTop
rectLeft
=
=
=
=
=
=
this.getSize ().height;
this.getSize ().width;
appletHeight /3;
appletWidth /3;
(appletHeight - rectHeight )/2;
(appletWidth - rectWidth )/2;
}
}
}
<APPLET code="Blink.class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
HEIGHT="50" WIDTH="40">
</APPLET>
Elipse i krunice
Elipsei krunicecrtajuse pomocumetode drawOval (), a pune pomocumetode
fillOval () cije su signature:
public abstract void drawOval (int
int
int
int
x,
y,
width,
height)
x,
y,
width,
height)
int height,
int startAngle ,
int arcAngle )
public abstract void fillArc (int
int
int
int
int
int
x,
y,
width,
height,
startAngle ,
arcAngle )
Primjer
bullseye
Klasa koja crta ovu slikuvelikaje 684 bytea. EkvivalentnaGIF slikaimalabi 1,850
bytea, dakle gotovotri puta vie.
Poligoni
U Javisu pravokutnicidefiniranipomocupozicijesvojeggornjeglijevogugla, visinei
irine. Implicitnose podrazumijevada pravokutniknijerotiran. Ako jest, moramoga
smatratispecijalnimslucajempoligona, tj. objekta izklase java.awt.Polygon .
Poligonisu definiranisvojimvrhovimabez dodatnihpretpostavkiosimda leeu
dvodimenzionalnojravnini.Osnovnikonstruktorklase Polygon je
public Polygon (int[] xpoints ,
int[] ypoints ,
int npoints )
ovako :
g.drawPolygon (myTriangle );
a poziva se ovako :
g.drawPolygon (xpoints , ypoints , xpoints .length);
Ucitavanje slika
Poligoni, elipse, linijei tekstovipokrivajuvelikidio grafickihpotreba. Ono to namjo
treba su slike. U Javito su GIF iliJPEG datoteke koje pokrivajuuglavnomsve.
Slikekoje se prikazujupomocuJava appleta ucitavajuse s mreepreko URLa koji
pokazujena datoteku sa slikom. Mogu bitispremljenena web posluitelju
, lokalnom
diskuilibilogdje kamo applet moedoci preko URLa. Treba pazitida budu spremljene
tamo gdje ce ihkorisnikkoji gledaapplet mocidohvatiti. URL koji pokazujena va
lokalnidisk modaradi dok testirateapplet, alimodanece bitiod koristiza nekoga tko
dolazis mree.
U praviluse, iako to nijenuno, slikestavljajuu istidirektorijgdje je applet iliu onaj gdje
je HTML datoteka. Staviteslikuu appletovdirektorijako ce se ona koristitiu svim
instancamaapleta, a u HTML direktorijako ce razliciteinstanceappleta koristitirazlicite
slike. Treca mogucnostje stavitisve slikeu nekiposebnidirektoriji onda preko <PARAM>
oznake reci appletugdje su.
Ako znatetocan URL slike, moeteje ucitatipomocumetode getImage ():
URL imageURL = new URL("http://www.prenhall .com/logo.gif");
java.awt.Image img = this.getImage (imageURL );
Metode getCodeBase() i
getDocumentBase()
Ako ne znatetocan URL slike, aliznatenjenoimei da se ona nalaziu istomdirektoriju
kao i applet, moetekoristitidruguvarijantumetode getImage () koja uzimaURL i ime
datoteke. Koristiteappletovumetodu getCodeBase () da dobijeteURL appletovog
direktorija:
Image img = this.getImage (this.getCodeBase (), "test.gif");
Pri tome je img objekt klase Image koji ste vec ucitaliunutarmetode init(). Nadalje,
x je apscisa, a y ordinatalijevoggornjeguglaslike. Argumentio je objekt klase koja
implementirainterfaceImageObserver . Taj interfacepropisujekako Java rukuje
asinhronimobnavljanjemslikekad se ona ucitavasa udaljenogracunala. Buducida klasa
java.applet.Applet implementiraImageObserver za sad samo stavitekljucnurijec
this za odgovarajuciargumentmetode drawImage () cimenaznacujeteda elitekoristiti
ImageObserver trenutnoaktivnogappleta.
Metoda paint() koja ne radi nitaosimcrtanjaslikeu pravoj velicini,poceviod
gornjeglijevoguglaizgledalabi ovako:
public void paint(Graphics g) {
g.drawImage (img, 0, 0, this);
}
Skaliranje slika
Slikumoetei skaliratiunutarzadanogpravokutnikakoristecisljedecuverzijumetode
drawImage () :
public boolean drawImage (Image img, int x, int y,
int width, int height, ImageObserver io)
{
= this.getParameter ("imagefile ");
= this.getImage (this.getCodeBase (), filename );
= Integer .parseInt (this.getParameter
Boje
Boje su u Javiinstanceklase java.awt.Color . Uvjeritese da ste importiralitu klasu
prije nego koristiteboje koje nisudefault. Nove boje moetekreiratikoristeciRGB
trojke kao kod web stranica. Na primjer:
Color medGray = new Color(127, 127, 127);
Color cream = new Color(255, 231, 187);
Color lightGreen = new Color(0, 55, 0);
Sistemske boje
U Javi1.1 i dalje, postojiklasa java.awt.SystemColor koja je podklasa od
java.awt.Color i omogucujekoritenjeboja native komponenata. Na primjer, ako
elitepozadinuvaet appleta ucinitiistomkao i pozadinuprozora, moeteu init()
metodipostupitiovako:
public void paint (Graphics g) {
g.setColor (SystemColor .control );
g.fillRect (0, 0, this.getSize ().width, this.getSize ().height);
}
Dostupnesu sljedecesistemskeboje:
SystemColor .desktop // Background color of desktop
SystemColor .activeCaption // Background color for captions
SystemColor .activeCaptionText // Text color for captions
SystemColor .activeCaptionBorder // Border color for caption
text
SystemColor .inactiveCaption // Background color for inactive
captions
SystemColor .inactiveCaptionText // Text color for inactive
captions
SystemColor .inactiveCaptionBorder // Border color for inactive
captions
SystemColor .window // Background for windows
SystemColor .windowBorder // Color of window border frame
SystemColor .windowText // Text color inside windows
SystemColor .menu // Background for menus
SystemColor .menuText // Text color for menus
SystemColor .text // background color for text
SystemColor .textText // text color for text
SystemColor .textHighlight // background color for highlighted
text
SystemColor .textHighlightText // text color for highlighted
text
SystemColor .control // Background color for controls
SystemColor .controlText // Text color for controls
SystemColor .controlLtHighlight // Light highlight color for
controls
SystemColor .controlHighlight // Highlight color for controls
SystemColor .controlShadow // Shadow color for controls
SystemColor .controlDkShadow // Dark shadow color for controls
SystemColor .inactiveControlText // Text color for inactive
controls
SystemColor .scrollbar // Background color for scrollbars
SystemColor .info // Background color for spot-help text
SystemColor .infoText // Text color for spot-help text
Fontovi
Vidjeliste primjercrtanjateksta u appletu HelloWorldApplet . Pozivatemetodu
drawString () za objekt tipa Graphics . Toj metodidajete argumenttipa String kao i
koordinatex i y. Ako je g objekt tipa Graphics onda je sintaksasljedeca:
g.drawString (String s, int x, int y)
Klasa FontMetrics
if (sb.length() > 0) {
g.drawString (sb.toString (), margin, ++i*fm.getHeight ());
}
}
}
<APPLET code="WrapTextApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
HEIGHT="200" WIDTH="100">
<PARAM name="Text" value="Jako dugi tekst koji se treba prelomiti ">
</APPLET>
to su komponente?
Komponentesu sastavnicegrafickogkorisnickogsucelja(GUI, graphical user
interface).
U Javi, komponentesu podklase od java.awt.Component , a najcece koritenesu:
Canvas
TextField
TextArea
Label
List
Button
Choice
Checkbox
Frame
JButton
JLabel
JComboBox
JMenu
Labele
Najjednostavnijakomponentaje java.awt.Label . U sljedecemprimjeruje Label l
redak teksta koji je read-only.
import java.applet.*;
import java.awt.*;
public class HelloContainer extends Applet {
public void init() {
Label l;
void addNotify ()
int getAlignment ()
synchronized void setAlignment (int alignment )
String getText ()
synchronized void setText (String text)
Buttoni
Buttonisu instanceklase java.awt.Button koja je podklasa od
java.awt.Component . Buttonise kreirajupomocukonstruktoraButton(String
label). On ce kreiratinovibuttonsa labelomkoja ce na njemubitiispisana. Kad ga
kreirate, moetega dodati razmjetaju. Na primjer,
Button b;
b = new Button("My First Button");
this.add(b);
import java.applet.*;
import java.awt.*;
Akcije na buttonima
Za razlikuod labela, buttonicineneto kad kliknetena njih. Kad mikliknena neki
objekt tipa Button , onda ce on ispalitiobjekt tipa ActionEvent . Da biste bilispremni
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
// Konstruiramo button
Button beep = new Button("Beep");
// dodajemo button razmjestaju
this.add(beep);
// propisujemo da ce action evente koje ovaj button posalje
// obraditi novi objekt klase BeepAction
beep.addActionListener (new BeepAction ());
}
}
<APPLET CODE="BeepApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
ARCHIVE ="Beep.jar"
WIDTH=100 HEIGHT=100>
</APPLET>
}
<APPLET CODE="BeepApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=100 HEIGHT=100>
</APPLET>
Viestruki ActionListeneri
Primijetiteda nisteogranicenina samo jedan listener po dogadaju. Na primjer, sljedeci
programgenerirapet beep-ova svakiput kad pritisnetebutton.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
Metode za buttone
Buttonisu jednostavniobjekti. Uglavnomsve to trebate napravitis njimaje dodati ihu
razmjetaji pridruitiim ActionListener . Na raspolaganjusu vami sljedecemetode:
public
public
public
public
public
public
public
void addNotify ()
String getLabel ()
synchronized void setLabel (String label)
void setActionCommand (String command )
String getActionCommand ()
void addActionListener (ActionListener l)
void removeActionListener (ActionListener l)
Action naredbe
Metode setActionCommand () i getActionCommand () modificirajukomandnistring
koji putujeuz ActionEvent . Po pretpostavci, to je labelabuttona, alito se moe
promijeniti
. Na primjer, moetena taj nacinproslijeditibroj ponaljanjabeep signalakoje
applet treba proizvesti.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
WIDTH=200 HEIGHT=100>
</APPLET>
Tekstualna polja
Klasa java.awt.TextField omogucujeugradnjumaske za unos i editiranjejedne linije
teksta. Korisnaje za jednostavneoperacijeunosa malihkolicinapodataka. Ima cetiri
konstruktora:
public
public
public
public
TextField ()
TextField (String text)
TextField (int num_chars)
TextField (String text, int num_chars)
TextArea
Klasa java.awt.TextArea je podklasa od java.awt.TextComponent koja
osiguravamaskuza editiranjevielinijateksta. Korisnaje za inputi output.
Na raspolaganjusu namcetirikonstruktora:
public TextArea ()
public TextArea (String text)
public TextArea (int rows, int columns )
public TextArea (String text, int rows, int columns )
public TextArea (String text, int rows, int columns , int
scrollbars )
Na primjer,
TextArea instructions = new TextArea ("", 15, 70,
TextArea .SCROLLBARS _VERTICAL _ONLY);
Klasa TextComponent
I TextArea i TextField su podklase od java.awt.TextComponent . Ova klasa
sadrimetode koje su zajednickeza obje klase, ukljucujucii nekolikometoda koje smo
vec vidjeli.: getText (), setText (), i setEditable (). Klasa TextComponent ima
takoder i metode za manipuliranjeselekcijomi kursoromte za procesiranjeTextEvent a.
Selekcijase koristiza copy/paste alii za drugesvrhe. Prviznak u TextComponent i je
znak broj 0; drugije znak broj 1 i tako dalje.
public synchronized
public synchronized
public synchronized
public synchronized
public synchronized
selectionEnd )
public synchronized
public synchronized
int getSelectionStart ()
void setSelectionStart (int selectionStart )
int getSelectionEnd ()
void setSelectionEnd (int selectionEnd )
void select(int selectionStart , int
void selectAll ()
String getSelectedText ()
Klasa Canvas
Klasa java.awt.Canvas definirapravokutnupovrinu(podlogu, pozadinu) po kojoj
moetepisatii crtatikoristecimetode izklase java.awt.Graphics . Klasa Canvas ima
samo tri metode:
public Canvas()
public void addNotify ()
public void paint(Graphics g)
Klasa Choice
Klasa java.awt.Choice implementirapopup izborniksa fiksnompozicijom(postoji
takoder i klasa java.awt.PopupMenu kod koje pozicijanijefiksnai pojavljujese kad
korisnikkliknei dridesnu tipkumia).
int getItemCount ()
String getItem (int index)
synchronized void add(String item)
synchronized void addItem (String item)
synchronized void insert(String item, int position )
synchronized void remove(String item)
synchronized void remove(int position )
synchronized void removeAll ()
Klasa Checkbox
Klasa java.awt.Checkbox , se koristiza selektiranjeboolean vrijednosti. Svaki
Checkbox imalabelukoja bi trebalareci korisnikuto pojediniCheckbox predstavlja.
Na primjerCheckbox sa labelom"Olives" u appletu Ingredients za narucivanjepizze
(vididolje) bilabi cekiranaako korisnikelimasline, a u protivnomnecekirana.
Dodavanje Checkbox a appletuje jednostavno. Deklarirajte, konstruirajtei dodajte:
Checkbox c;
c = new Checkbox ("Pepperoni "));
add(c);
}
class Pricer implements ItemListener {
TextField out;
double price;
public Pricer(double baseprice , TextField out) {
this.price = baseprice ;
this.out = out;
}
public void itemStateChanged (ItemEvent ie) {
if (ie.getStateChange () == ItemEvent .SELECTED ) this.price +=
0.50f;
else this.price -= 0.50f;
// Change the price
this.out.setText (String.valueOf (price));
}
}
<APPLET CODE="Ingredients .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
ARCHIVE ="Pizza.jar"
WIDTH=200 HEIGHT=200>
</APPLET>
Klasa CheckboxGroup
Checkbox grupesu kolekcijecheckboxakoje imajuspecijalnosvojstvoda unutargrupe
ne moebiticekiranovieod jednogcheckboxaistovremeno. Takvicheckboxoviizklase
CheckboxGroup se cesto zovuradio buttons. Checkboxovikoji pripadajuistoj
CheckboxGroup i ne moguse istovremenocekirati. Kad korisnikcekira jednog, sviostali
se automatskidecekiraju.
Konstruktorza CheckboxGroup je trivijalan.Nema argumenatai cak ne morate
dodavatitu komponentuappletujer ona nijedio korisnickogsuceljanego naprosto nacin
uredenjacheckboxova.
CheckboxGroup cbg = new CheckboxGroup ();
Primjer CheckboxGroup
Sljedeciprogrampita korisnikakako eliplatitipizzu. Primijetiteda za razlikuod
prethodnogprimjerau kojem je mogaoizabrativiedodataka na pizzu, sada moe
odabratitocno jedan nacinplacanja.
import java.applet.*;
import java.awt.*;
public class PaymentMethod extends Applet {
public void init() {
this.add(new Label("How will you pay for your pizza?"));
CheckboxGroup cbg = new CheckboxGroup ();
this.add(new Checkbox ("Visa", cbg, false));
this.add(new Checkbox ("Mastercard ", cbg, false));
this.add(new Checkbox ("American Express ", cbg, false));
this.add(new Checkbox ("Discover ", cbg, false));
this.add(new Checkbox ("Cash", cbg, true)); // the default
}
}
<APPLET CODE="PaymentMethod .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
ARCHIVE ="Pizza.jar"
WIDTH=200 HEIGHT=200>
</APPLET>
Klasa List
Listesa scrollbarom, objektiklase java.awt.List , korisnesu za spremanjeduljih
popisa red po red. Elementilistesu stringovi. Na primjer,
Na primjer,
List l = new List(8, true);
synchronized
synchronized
synchronized
synchronized
void
void
void
void
removeAll ()
remove(String item)
remove(int position )
delItem (int position )
ListEvents
Listscan firetwo separate types of events. When a listitemis selectedor deselected, the
List firesan ItemEvent . However, whenthe user doubleclickson a listitem, the List
firesan ActionEvent . Therefore, you can registerboth an ItemListener to process
selectionsand/or an ActionListener to process doubleclicks.
public
public
public
public
void
void
void
void
addItemListener (ItemListener l)
removeItemListener (ItemListener l)
addActionListener (ActionListener l)
removeActionListener (ActionListener l)
Klasa Scrollbar
Klase List , TextArea , i ScrollPane s imajugotovescrollbare. No ako elitescrollati
nekidrugiobjekt, treba vamklasa java.awt.Scrollbar . Scrollbariimajupuno
primjena. Elementarnaje pomicanjevidljivogpodrucja. Takoder se mogukoristitiza
postavljanjevrijednostiizmedudva zadanabroja. Ilimoguprolazitikroz vieekrana, kao
u operacijamana bazamapodataka koje trae sukcesivneslogove.
Imamotri konstruktora:
public Scrollbar ()
public Scrollbar (int orientation )
public Scrollbar (int orientation , int value, int visible , int min,
int max)
import java.awt.event.*;
public class Scrollie extends Applet implements AdjustmentListener
{
TextField t;
Scrollbar sb;
public void init() {
int initialValue = 1;
sb = new Scrollbar (Scrollbar .HORIZONTAL , initialValue , 1, 1,
100);
sb.addAdjustmentListener (this);
this.add(sb);
this.t = new TextField (4);
this.t.setText (String.valueOf (initialValue ));
this.add(t);
}
public void adjustmentValueChanged (AdjustmentEvent e) {
int val = sb.getValue ();
this.t.setText (String.valueOf (val));
}
}
<APPLET CODE="Scrollie .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=200 HEIGHT=100>
</APPLET>
Proceduralni programi
Tradicionalno,proceduralniprogramiimajujedinstvenporedak izvravanja. Kontrolase
prebacuje linearnood prve naredbe na drugu, od drugena trecu i tako dalje, sa
eventualnimpetljamai grananjima. Korisnikunosipodatke samo u tocno odredenim
trenucima, kad je racunalospremnoprimitite podatke.
Programikoji podravajuGUI (GraphicalUser Interface) ne mogufunkcioniratina takav
nacin. Korisnikumora bitiomogucenoda praktickiu svakomtrenutkukliknemiem,
odabere stavkuizbornika, unesetekst i slicno.
komponentadobilailiizgubilafokus
java.awt.event.KeyEvent
izvrenaje naredba
java.awt.event.AdjustmentEvent
vrijednosttekstualnogobjekta se promijenila
Na primjer, kad korisnikkliknemiemna buttoni zatimga otpusti, buttonce dobititri
odvojenadogadaja nierazine, tipa MouseEvent (jedan za pritisaktipke mia, mouse
down, drugiza otputanjetipke, mouse up, trecieventualnoza povlacenjemia, mouse
drag, ako je nastupilo). Buttonce nakon toga ispalitijedan dogadaj vierazine, tipa
ActionEvent .
Ako korisnikkliknemiemna button, povuce miaizvanbuttonai onda ga otpusti, button
ce dobitidva odvojenadogadaja nierazine(jedan za mouse down, drugiza mouse
drag). U tom slucajuignoriratce ihi nece ucinitinita.
+--java.awt.event.WindowEvent
Obrada dogadaja
Za obradu dogadaja izrepa zaduenaje Java runtime. Posebno, ona osiguravada svaki
dogadaj niskerazinedospije do odgovarajucekomponente. Ne moratese brinutikojoj je
komponentikoji dogadaj namijenjen. To sustavrjeava automatski. Specijalno, runtime
prosljedujedogadaj metodi processEvent () klase java.awt.Component :
protected void processEvent (AWTEvent e)
void
void
void
void
void
processComponentEvent (ComponentEvent e)
processFocusEvent (FocusEvent e)
processKeyEvent (KeyEvent e)
processMouseEvent (MouseEvent e)
processMouseMotionEvent (MouseEvent e)
Razliciti EventListeneri
Da biste omoguciliodgovaranjena dogadaje koje komponentadobiva, pridruujete
komponenti(registrirate) event listener odgovarajucegtipa. Eventlistenerje svakiobjekt
koji implementirasucelje java.util.EventListener . AWT definiravienjegovih
podsucelja, po jedno za svakitip dogadaja. Npr.:
java.awt.event.ComponentListener
java.awt.event.ContainerListener
java.awt.event.FocusListener
java.awt.event.KeyListener
java.awt.event.MouseListener
java.awt.event.MouseMotionListener
java.awt.event.WindowListener
java.awt.event.ActionListener
java.awt.event.AdjustmentListener
java.awt.event.ItemListener
java.awt.event.TextListener
java.awt.event.AWTEventListener
java.awt.event.HierarchyBoundsListener
java.awt.event.HierarchyListener
java.awt.event.InputMethodListener
abstract
abstract
abstract
abstract
abstract
void
void
void
void
void
mouseClicked (MouseEvent e)
mousePressed (MouseEvent e)
mouseReleased (MouseEvent e)
mouseEntered (MouseEvent e)
mouseExited (MouseEvent e)
Kodovi tipki
Nisu sve tastaturenapravljenena istinacin. Mac imatipke za naredbe i opcije. PC ima
Alttipke. Neki imajutipkuWindows95, nekinemaju. Neki imajunumerickutastaturu,
nekine. Emacsocekuje Meta tipkukoja rijetkozasebnopostoji, no obicnoje pridruena
Escape tipki(koju takoder neke tastaturenemaju). Nekonzistentnosttastaturaje je jedan
od problemas kojimase cross-platform environment mora na nekinacinpozabaviti.
Klasa Java.awt.event.KeyEvent definiraneto vieod stotinuvirtualnihkodova za
tipke koji se mapirajuna razlicite, uvijekprisutne, tipke. KeyEvent .VK_0 do
KeyEvent .VK_9 su iste kao znakoviASCII '0' do '9' (0x30 - 0x39)
KeyEvent .VK_0
KeyEvent .VK_1
KeyEvent .VK_2
KeyEvent .VK_3
KeyEvent .VK_4
KeyEvent .VK_5
KeyEvent .VK_6
KeyEvent .VK_7
KeyEvent .VK_8
KeyEvent .VK_9
KeyEvent .VK_A do KeyEvent .VK_Z su istikao ASCII 'A' do 'Z'; dakle imamo,
KeyEvent .VK_A, KeyEvent .VK_B, KeyEvent .VK_C, KeyEvent .VK_D,
KeyEvent .VK_E, KeyEvent .VK_F itd.
KeyEvent .VK_ACCEPT
KeyEvent .VK_ADD
KeyEvent .VK_ALT
KeyEvent .VK_BACK_QUOTE
KeyEvent .VK_BACK_SLASH
KeyEvent .VK_BACK_SPACE
KeyEvent .VK_CANCEL
KeyEvent .VK_CAPS_LOCK
KeyEvent .VK_CLEAR
KeyEvent .VK_F4
KeyEvent .VK_F5
KeyEvent .VK_F6
KeyEvent .VK_F7
KeyEvent .VK_F8
KeyEvent .VK_F9
KeyEvent .VK_F10
KeyEvent .VK_F11
KeyEvent .VK_F12
KeyEvent .VK_NUMPAD4
KeyEvent .VK_NUMPAD5
KeyEvent .VK_NUMPAD6
KeyEvent .VK_NUMPAD7
KeyEvent .VK_NUMPAD8
KeyEvent .VK_NUMPAD9
KeyEvent .VK_OPEN_
KeyEvent .VK_CLOSE_
BRACKET
KeyEvent .VK_COMMA
KeyEvent .VK_CONTROL
KeyEvent .VK_CONVERT
KeyEvent .VK_DECIMAL
KeyEvent .VK_DELETE
KeyEvent .VK_DIVIDE
KeyEvent .VK_DOWN
KeyEvent .VK_END
KeyEvent .VK_ENTER
KeyEvent .VK_EQUALS
KeyEvent .VK_ESCAPE
KeyEvent .VK_F1
KeyEvent .VK_F2
KeyEvent .VK_F3
KeyEvent .VK_HOME
KeyEvent .VK_INSERT
KeyEvent .VK_KANA
KeyEvent .VK_KANJI
KeyEvent .VK_LEFT
KeyEvent .VK_META
KeyEvent .VK_
MODECHANGE
KeyEvent .VK_MULTIPLY
KeyEvent .VK_
NONCONVERT
KeyEvent .VK_NUM_LOCK
KeyEvent .VK_NUMPAD0
KeyEvent .VK_NUMPAD1
KeyEvent .VK_NUMPAD2
KeyEvent .VK_NUMPAD3
KeyEvent .VK_PAGE_UP
KeyEvent .VK_PAUSE
KeyEvent .VK_PERIOD
KeyEvent .VK_
PRINTSCREEN
KeyEvent .VK_QUOTE
KeyEvent .VK_RIGHT
KeyEvent .VK_SCROLL_
LOCK
KeyEvent .VK_SEMICOLON
KeyEvent .VK_SEPARATER
KeyEvent .VK_SHIFT
KeyEvent .VK_SLASH
KeyEvent .VK_SPACE
KeyEvent .VK_SUBTRACT
KeyEvent .VK_TAB
KeyEvent .VK_UNDEFINED
KeyEvent .VK_UP
boolean
boolean
boolean
boolean
isShiftDown ()
isControlDown ()
isMetaDown ()
isAltDown ()
InputEvent .SHIFT_MASK
InputEvent .CTRL_MASK
InputEvent .META_MASK
InputEvent .ALT_MASK
InputEvent .ALT_GRAPH_MASK
InputEvent .BUTTON1_MASK
InputEvent .BUTTON2_MASK
InputEvent .BUTTON3_MASK
Moete ihdoznatipomocumetode getModifiers ():
public int getModifiers ()
abstract
abstract
abstract
abstract
void
void
void
void
componentResized (ComponentEvent e)
componentMoved (ComponentEvent e)
componentShown (ComponentEvent e)
componentHidden (ComponentEvent e)
Adapteri
Adapterisu klase koje implementirajupojedinasuceljatako da sve deklariranemetode iz
suceljaprekrijumetodamakoje ne cinenita. AWT osiguravavieadapterskihklasa za
razlicitevrste EventListener a. To su:
ComponentAdapter
ContainerAdapter
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
abstract
abstract
abstract
abstract
abstract
void
void
void
void
void
mouseClicked (MouseEvent e)
mousePressed (MouseEvent e)
mouseReleased (MouseEvent e)
mouseEntered (MouseEvent e)
mouseExited (MouseEvent e)
package java.awt.event;
import java.awt.*;
import java.awt.event.*;
void
void
void
void
void
mouseClicked (MouseEvent e) {}
mousePressed (MouseEvent e) {}
mouseReleased (MouseEvent e) {}
mouseEntered (MouseEvent e) {}
mouseExited (MouseEvent e) {}
import java.awt.*;
import java.awt.event.*;
public class MouseBeeper extends MouseAdapter
void
void
void
void
mousePressed (MouseEvent e) {}
mouseReleased (MouseEvent e) {}
mouseEntered (MouseEvent e) {}
mouseExited (MouseEvent e) {}
Apsorbiranje dogadaja
Ponekad je potrebno neke dogadaje zadratikako ihkomponentane bi procesiralana
uobicajennacin. Na primjer, programza izraduvizualnogsuceljamodatreba dozvoliti
korisnikupovlacenjemiapo ekranu. U tom slucajune eliteda obicanklikna tipkumia
aktiviratu funkciju. Zato komponentamoeapsorbirati(consume) dogadaje tipa
InputEvent , dakle MouseEvent ilia KeyEvent , tako da pozove njihovumetodu
consume () :
public void consume ()
Na primjer:
EventQueue MyQueue = new EventQueue ();
synchronized
synchronized
synchronized
synchronized
Osmo predavanje
komponenti
razmjetaj
public FlowLayout ()
Podeavanje poravnanja za
FlowLayout
Poravnanjeza neki FlowLayout zadajetepomocuodgovarajucegkonstruktora.
Komponentesu u appletupo pretpostavcicentrirane. Moete umjestotoga odreditida
budu lijevoilidesno pozicionirane
. Za to moetekoristitigotovekonstante
FlowLayout .LEFT , FlowLayout .RIGHT iliFlowLayout .CENTER prilikompozivanja
konstruktora, npr.
this.setLayout (new FlowLayout (FlowLayout .LEFT));
this.setLayout (new FlowLayout (FlowLayout .RIGHT));
this.setLayout (new FlowLayout (FlowLayout .CENTER));
Razdvajanje komponenti za
FlowLayout
Vecina LayoutManager a omogucujevamkontrolunad minimalnim
vertikalnimi
horizontalnimprostoromkoji razdvajakomponente. Za FlowLayout zadajeteeljeni
prostor u pikseleima, putemodgovarajucihargumenatau konstruktoru:
public FlowLayout (int alignment , int hspace, int vspace);
new
new
new
new
new
Button("Play"));
Button("Rewind"));
Button("Fast Forward "));
Button("Pause"));
Button("Stop"));
}
}
<APPLET CODE="SpaceTapeDeck .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=400 HEIGHT=100>
</APPLET>
this.add(new
this.add(new
this.add(new
this.add(new
this.add(new
Button("North"),
Button("South"),
Button("East"),
Button("West"),
Button("Center"),
BorderLayout .NORTH);
BorderLayout .SOUTH);
BorderLayout .EAST);
BorderLayout .WEST);
BorderLayout .CENTER);
}
}
<APPLET CODE="BorderButtons .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=200 HEIGHT=100>
</APPLET>
Promjena karata
U pravilusvakoj karti dodajete panelkoji imavlastitiLayoutManager . Svaka karta
treba bitisnabdjevenanekimuputnicamaza navigacijumedukartama. Sam AWT nema
gotovogtakvogalata. Primijetitetakoder da jednukomponentumoetedodati na vieod
jedne karte. To je korisno, na primjer, za kreiranjeChoice izbornikasa imenimasvih
karata kao navigacijskimpomagalom.
Sljedecihpet metoda klase java.awt.CardLayout omogucujepromjenuaktivnekarte.
U svimslucajevimatreba specificiratikontejnerunutarkojega prelazimos karte na kartu.
To moebitiapplet, prozor ilipanelkoji je uredenu skladus timrazmjetajem.
public
public
public
public
public
void
void
void
void
void
first(Container parent)
next(Container parent)
previous (Container parent)
last(Container parent)
show(Container parent, String name)
import java.applet.*;
import java.awt.*;
public class Ingredients 2 extends Applet {
TextField t;
double price = 7.00;
public void init() {
this.setLayout (new GridLayout (11,1));
this.add(new Label("What do you want on your pizza?",
Label.CENTER));
this.add(new Checkbox ("Pepperoni "));
Specifikacije GridBagConstraints
Svakoj komponentikoju kontroliraGridBagLayout pridruenje po jedan objekt iz
klase java.awt.GridBagConstraints koji specificirapoloajunutarpovrineza
prikaz. Takav objekt zajednosa minimalnomipreferiranomvelicinomkomponente
odreduje gdje se i kako povrinaza prikazsmjetaunutarappleta.
Konstruktorza GridBagConstraints () je trivijalan:
GridBagConstraints gbc = new GridBagConstraints ();
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(0, 1)
(1, 1)
(2, 1)
(3. 1)
(0, 2)
(1, 2)
(2, 2)
(3, 2)
(0, 3)
(1, 3)
(2, 3)
(3, 3)
(0, 4)
(1, 4)
(2, 4)
(3, 4)
(0, 5)
(1, 5)
(2, 5)
(3, 5)
Atribut fill
Atributfill specificiranacinna koji komponentaispunjavaprostor koji joj je dodijeljen
(u slucajuda je prostor veciod same komponente). Mnemonickekonstantekoje koristite
za postavljanjeove varijablesu:
GridBagConstraints .NONE : komponentane mijenjavelicinu
GridBagConstraints .HORIZONTAL : Komponentace se protezatipreko cijele
Atribut Insets
Atributinsets je instancaklase java.awt.Insets . On specificirarazmakizmedu
komponentei rubovapovrinena kojoj je smjetena. Za sve tipke u naemkalkulatoru
odredilismo da to bude 3 pikselasa svake strane (to osiguravada susjednetipke budu
razmaknuteza 6 piksela), pa imamona primjer
GBC_bigequals .insets = new Insets(3, 3, 3, 3);
GBC_0.insets = new Insets(3, 3, 3, 3);
Atribut anchor
Kad je komponentamanjenego raspoloivapovrina, atributanchor specificirapoloaj
unutarcelijekamo komponentutreba staviti. Mnemonickekonstantekoje za to koristite
slicnesu onimaza BorderLayout . Tos u
GridBagConstraints .CENTER
GridBagConstraints .NORTH
GridBagConstraints .NORTHEAST
GridBagConstraints .EAST
GridBagConstraints .SOUTHEAST
GridBagConstraints .SOUTH
GridBagConstraints .SOUTHWEST
GridBagConstraints .WEST
GridBagConstraints .NORTHWEST
Pretpostavljenavrijednostje GridBagConstraints .CENTER .
U naemprimjeruto nije
eksplicitnonavedenojer su komponentedovoljnovelikeu odnosu na raspoloive
povrine, tako da je centriranapozicijazadovoljavajuca.
Primjer za GridBagLayout
}
}
}
<APPLET CODE="ManualLayout .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=100 HEIGHT=100>
</APPLET>
to je Container?
Kontejnerje komponentakoja moesadratidrugekomponente. On je uvijekinstanca
klase java.awt.Container koja je podklasa od java.awt.Component pa su dakle
kontejnerii samitakoder komponente.
Opcenito, komponentese nalazeu nekomkontejneru. Appletje primjerkontejnera, no
to mogubitii prozori(windows), okviri(frames), dijalozi(dialogs) i paneli(panels).
Kontejnerimogusadravatidrugekontejnere.
Svakikontejnerimasvoj Layout manager koji odreduje nacinpozicioniranja
komponenataunutarkontejnera.
Ukratko, kontejnerisadre komponente. Komponentesu pozicioniraneunutarkontejnera
u skladusa pridruenimLayout managerom. Buducida su kontejneritakoder
komponente, onise mogunaciunutardrugihkontejnera. Primijetimoda appleti
osiguravajuvec gotovkontejneri pretpostavljeniLayout manager. To je FlowLayout .
Paneli
Svaki Panel je zapravogenerickiContainer cija je glavnaulogapodijelitiprikaznu
povrinuu odvojenepravokutnedijelove. Buducida svaki Panel moeimatisvoj vlastiti
LayoutManager ,
Ugnijedeni paneli
4, 3, 3));
2, 3, 3));
1, 3, 3));
2, 3, 3));
C1.add(new Button("1"));
C1.add(new Button("2"));
B2.add(C1);
B2.add(new Button("0"));
// 3, . and =
Panel B3 = new Panel();
B3.setLayout (new GridLayout (1, 2, 3, 3));
// 3 and .
Panel C2 = new Panel();
C2.setLayout (new GridLayout (2, 1, 3, 3));
C2.add(new Button("3"));
C2.add(new Button("."));
B3.add(C2);
B3.add(new Button("="));
A3.add(B2);
A3.add(B3);
}
public Insets insets() {
return new Insets(5, 5, 5, 5);
}
/* Use 1.0 event handling since I need to run this
inside today's web browsers . */
public boolean action(Event e, Object arg) {
if (e.target instanceof Button) {
screen.setText ((String) arg);
return true;
}
return false;
}
}
<APPLET CODE="Calculator .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=150 HEIGHT=150>
</APPLET>
Prozori (windows)
Klasa java.awt.Window i njenepodklase omogucujuvamkreiranjesamostalnih
prozora. Samostalniprozorisu cesti u aplikacijamakoje koje za komunikacijus
korisnikomkoristeAWT umjestokomandnelinije. Takoder osiguravajudodatniprostor
za applete.
Klasa java.awt.Window je podklasa od java.awt.Container , alije nezavisnaod
ostalihkontejnera, tj. sam nijesadranu drugimkontejnerima. Moete mudodavati
komponentekao to je Button iliTextField . Moe imatisvoj vlastitiLayoutManager .
Okviri (frames)
Okvirisu korisniza kompleksnijeaplikacije. Omogucujuvamodvajanjerazlicitihfunkcija
ilipodataka u razliciteprozore. Na primjer, aplikacijaza crtanjemoeimatinekoliko
razlicitihslikas raznimstatusimazavrenostiu razlicitimprozorima. Ilimodamoeimati
jednusliku, aliu drugomprozorupaletus raznimcetkama i bojama. Svakiod tihprozora
bio bi Frame .
Sve to vamtreba za kreiranjeokvirai rad s njimanalazise u klasi java.awt.Frame . Za
kreiranjenovogokvirabez naslovneletvicekoristitcete konstruktorFrame() bez
argumenata.
Frame f = new Frame();
umjestosamo
this.add(new Button("OK"));
Ili
f.add(new Label("This is a frame", Label.CENTER),
BorderLayout .CENTER);
abstract
abstract
abstract
abstract
abstract
abstract
abstract
void
void
void
void
void
void
void
windowOpened (WindowEvent e)
windowClosing (WindowEvent e)
windowClosed (WindowEvent e)
windowIconified (WindowEvent e)
windowDeiconified (WindowEvent e)
windowActivated (WindowEvent e)
windowDeactivated (WindowEvent e)
public
public
public
public
public
void
void
void
void
void
windowClosed (WindowEvent e) {}
windowIconified (WindowEvent e) {}
windowDeiconified (WindowEvent e) {}
windowActivated (WindowEvent e) {}
windowDeactivated (WindowEvent e) {}
Dijalozi
Okvirisu korisnikao prozorikoji ce se neko vrijemezadratina ekranu, na primjeru
svrhueditiranjanekog teksta i slicno. Za razlikuod njih, dijalozikoje implementiraklasa
java.awt.Dialog ,
Metode za dijaloge
Buducida su dijalozikomponente, onimogu, kao i okviri, koristitimetode kao to su
setLocation () ilisetSize () . Za dijalogeimamokonstruktorekoji imdaju iline daju
naslov, pa moemo, na primjer, staviti:
Dialog d = new Dialog(new Frame(), false);
Prviargumentje parent frame za taj dijalog, dok je drugi tipa boolean i odreduje hoce
lidijalogbitimodalan(true ) iline (false ). Modalnidijalozisu modalniu odnosu na svoj
parent frame, dakle privremenosprecavajuunos u taj okvir, aline i u drugeokvire.
Ako za prviargumentstavitenull dijalogce izbacitiiznimku,
java.lang.IllegalArgumentException .
Ako kreirateparent framedirektnounutarpozivakonstruktorakao u prethodnom
primjeru, dijalogne moebitiuistinumodalan.
Ima jo i nekihmanjihrazlikaizmeduokvirai dijaloga, npr.:
Primjeri dijaloga
Sljedeciprogramprikazujejednostavnine-modalnidijalogsa OK buttonomi bez
naslovneletvice.
import java.applet.*;
import java.awt.*;
public class DialogTester extends Applet {
public void init() {
Dialog myDialog = new Dialog(new Frame(), false);
myDialog .setLocation (320,240);
myDialog .add("North", new Label("Hello!"));
myDialog .add("South", new Button("OK"));
myDialog .pack();
myDialog .show();
}
}
<APPLET CODE="DialogTester .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=150 HEIGHT=150>
</APPLET>
Deveto predavanje
slike i zvukovi
izbornici,
to je izbornik?
Java omogucujepostavljanjeizbornikana frameove(dijalozimase izbornicine mogu
dodavati). Za applete to i nijetako bitno, aliu aplikacijamaje najcece nuno.
Izbornicisu sastavljeniod tri hijerarhijskaelementaPrvielementje izbornickaletvica
(menu bar) i sastojise od razlicitihizbornika. Nalazise na gornjemrubu ekrana kod
Macintoshailina gornjemrubu prozora kod WindowsailiMotifa.
Klase izbornika
Paket AWT sadrinekolikoglavnihklasa za upravljanjeizbornicima
:
java.awt.Menu
java.awt.MenuBar
java.awt.MenuItem
java.awt.PopupMenu
Kreiranje izbornika
Izbornikeje poeljnopotpunoizgraditiprije nego ihprikaete. Tipicniredosljedje
ovakav:
1.
2.
3.
4.
MenuItem ("Cut"));
MenuItem ("Copy"));
MenuItem ("Paste"));
MenuItem ("Clear"));
Konacno, kad je MenuBar gotov, dodat cete ga okviru, dakle objektu tipa Frame
koristecise frameovommetodom setMenuBar (MenuBar mb). Ako imateFrame f
onda bi to izgledaloovako:
f.setMenuBar (myMenuBar );
Primjer izbornika
Aplikacijamoeimatimnogoopcija, cak i po viestotina. Sve njihstavitiu init()
metodubilobi neprakticno. Uobicajenoje kreiratiodvojenemetode koje grade svaki
pojediniizborniki dodaju ihizbornickojletvici. Sljedeciprogramkreira dva standardna
izbornika, File i Edit.
import java.applet.*;
import java.awt.*;
mb.add(fileMenu );
}
}
<APPLET CODE="MenuTester .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=200 HEIGHT=100>
</APPLET>
}
protected void makeEditMenu (MenuBar mb) {
Menu editMenu = new Menu("Edit");
this.addItem (editMenu , "Undo");
editMenu .addSeparator ();
this.addItem (editMenu , "Cut");
this.addItem (editMenu , "Copy");
this.addItem (editMenu , "Paste");
this.addItem (editMenu , "Clear");
mb.add(editMenu );
}
protected void makeFileMenu (MenuBar mb) {
Menu fileMenu = new Menu("File");
this.addItem (fileMenu , "New");
this.addItem (fileMenu , "Open...");
fileMenu .addSeparator ();
this.addItem (fileMenu , "Close");
this.addItem (fileMenu , "Save");
this.addItem (fileMenu , "Save As...");
fileMenu .addSeparator ();
this.addItem (fileMenu , "Page Setup...");
this.addItem (fileMenu , "Print");
fileMenu .addSeparator ();
this.addItem (fileMenu , "Quit");
mb.add(fileMenu );
}
Izbornicke kratice
Izbornickekratice, poznatei pod nazivomakceleratoriilitipovniekvivalentinaredbe,
obicnone ubrzavajunita, alibuducida ihkorisnicivole, komercijalneaplikacijeih
trebajusadravati.
Klasa java.awt.MenuShortcut predstavljatakve kraticeu Javi. Ima sljedece
konstruktore:
public MenuShortcut (int key)
public MenuShortcut (int key, boolean useShiftModifier )
Slike
Slikeu Javisu bitmapiraneGIF iliJPEG datoteke koje mogusadravatiproizvoljnusliku.
Moete ihkreiratibilokojimprogramomkoji je u stanjunapravitiGIF iliJPEG format.
Ucitavanje slika
Ako znatetocan URL slikekoju eliteucitati, moeteto ucinitiovako:
URL imageURL = new URL("http://student .math.hr/~vedris/java/images/
sun.jpg");
Image img = getImage (imageURL );
Crtanje slika
Jednomkad ste slikuucitalis nekog URL-a, relativnoje jednostavnoiscrtatije. To cete
ucinitiu paint() metodi, koristecineku od metoda drawImage () izklase
java.awt.Graphics , npr.
public boolean drawImage (Image img, int x, int y, ImageObserver io)
Paket java.awt.image
Paket java.awt.image sadriklase i suceljakoje omogucujukreiranjenovihslikafrom
scratch umjestoucitavanjai modificiranjavec postojecihslika.
Sucelja
java.awt.image.ImageConsumer
java.awt.image.ImageObserver
java.awt.image.ImageProducer
Klase
java.awt.image.AreaAveragingScaleFilter
java.awt.image.ColorModel
java.awt.image.CropImageFilter
java.awt.image.DirectColorModel
java.awt.image.FilteredImageSource
java.awt.image.ImageFilter
java.awt.image.IndexColorModel
java.awt.image.MemoryImageSource
java.awt.image.PixelGrabber
java.awt.image.RGBImageFilter
java.awt.image.ReplicateScaleFilter
Sucelja ImageProducer,
ImageObserver, ImageConsumer
Kad pozoveteappletovumetodu getImage (), slikase ne moeodmahpojaviti, vec
mora proci neko vrijemeda se ona ucita. Vece slikeucitavatce se due. Ako se slika
ucitavasa Interneta, to moepotrajatijo due.
Umjestocekanja da se slikaucita, metoda getImage () se vraca odmah, modai prije
nego to se veza s udaljenimracunalomuopce uspostavila. Ona vraca objekt tipa Image ,
alion inicijalnomodane sadrinikakvepodaatke. Raznemetode u paketu AWT koje
koristeslikeponaajuse u skladus tim. Na primjer, ako je samo gornjapolovicaslike
dostupnau trenutkukad se pozove neka od metoda drawImage () izklase Graphics ,
bit ce prikazanasamo ta gornjapolovica.
U meduvremenu,u pozadini, u odvojenomthreadu, nekiImageProducer, dakle objekt iz
klase koja implementirasucelje java.awt.image.ImageProducer , popunjavasliku
pixelimato bre moe. Kako viepixelapostane dostupno, bar za jedan redak, on ce
obavijestitio tome sve ImageObservere koji su registriranida imajuinteresza tu sliku.
Kako neki ImageObserver registrirasvoj interesza sliku? Tako da ga se proslijedi
metodikoja neto radi sa slikom. Na primjer, sjetitese da metode drawImage (), iz
Sucelje ImageConsumer
Sucelje java.awt.image.ImageConsumer je manjeobicno. Dok ImageProducer
nekom ImageObserver u samo kae da je dio slikespreman, dotle zainteresiranom
ImageConsumer u daje stvarnepodatke o slici. Sucelje ImageConsumer propisuje
sljedecemetode:
public
public
public
public
abstract
abstract
abstract
abstract
void
void
void
void
else {
showStatus ("x: " + x + " y: " + y + " sirina: " + width
+ " visina: " + height);
this.repaint ();
}
return true;
}
}
<APPLET CODE="ImageStatus .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes /
ImageProcessing "
WIDTH=435 HEIGHT=300>
<PARAM NAME="imagefile " VALUE="sun.jpg">
</APPLET>
to je zapravo slika?
Slikaje pravokutnamreapixela. Ona imakonacnuirinui visinukoje se moguizraziti
brojem pixela. Svakipixelje kvadratickoji imafiksnuvelicinuna danomekranu. Velicina
pixelamoeovisitio ekranii racunalu.
Svakipixelimaneku boju. Boja je 32-bitniinteger. Prvihosam bitovaodreduje udio
crveneboje, drugihosam udiozelene, a trecihosam udioplaveboje. Preostalihosam
pixelaodreduje transparentnostpixela.
11111111 11111111 11111111 11111111
Transparency
Red
Green
Blue
Operator <<
Operator << pomicebitovecijelihbrojeva prema lijevo, bez znaka. To se moeprakticno
iskoristitiu kreiranjuboja. Pogledajmoopet primjerumjerenosiveboje:
255 127 127 127
Ovdje je transparentnost(alpha channel) 255 (11111111), dakle potpunoneprozirno,
dok su kanaliza red, green, bluepostavljenina 127 (01111111). To znacida je boja
predstavljenacijelimbrojem 11111111011111110111111101111111 odnosno
-8,421,505. Naravno, cjelobrojnavrijednostnas ovdje ne zanima, bitnaje binarna
reprezentacija.
Dakle, kako se kreirajuovakve boje?. Jednostavnoinicijalizirajte
cijelebrojeve na
vrijednostikoje eliteza svakiod cetirikanala, uporabiteoperator << kojimcete iz
odvucina pravo mjestoi kombinirajtebitovskimOR operatorom, |. Taj operator
postavljaodredenibit u rezultatuna 1 ako je on tako postavljenu bilokojem operandu.
Na primjer, da bismokreiralicistuplavuboju, stavimo:
int
int
int
int
int
Kreiranje slika
//
//
red = 217;
green = 10;
blue = 186;
opaque = 255;
Metoda getRGB()
Manipulacijubitovimane morateuvijekobavljatisami. Umjestotoga moetekreiratinovi
objekt tipa java.awt.Color i uporabitinjegovumetodu getRGB() da dobijete
odgovarajucuint vrijednost. Na primjer,
Color purple = new Color(217, 10, 186)
int p = purple.getRGB();
int[] pixels = new int[5000];
for (int i=0; i < pixels.length; i++) pixels[i] = p;
MemoryImageSource purpleMIS = new MemoryImageSource (100, 50,
pixels, 0, 50);
theImage = createImage (purpleMIS );
Pretapanje boja
Slikakoja donosijednobojnupodlogukao to
je prethodna, moese kreiratii na viedrugihi
efikasnijihnacinanego to je manipuliranje
pixelima. Medutim, neke je slikeipak
najjednostavnijenapravitiba takvim,
algoritamskimpristupom. Pogledajmosljedeci
applet koji kreira slikuvelicine256 x 256
pixelana kojoj se pretapajucrvena, zelena, crna i utaboja.
(Kvalitetaove slikeovisiu mnogomei o kvalitetimonitora.)
import java.applet.*;
import java.awt.*;
import java.awt.image.*; // Don't forget this!
Filtriranje slika
Klasa RGBImageFilter
Klasa java.awt.image.RGBImageFilter je apstraktnapodklasa od
java.awt.image.ImageFilter . Omogucujepisanjefiltarakoji modificirajupixele,
jedan po jedan. Koristise kad je filtriranjesvakog pixelanezavisnood ostalihpixela. Nije
pogodna za filteru kojimafiltriranjeovisio susjednimpixelimakao to je npr. filtarkoji
uprosjecujeokolnepixele.
Jedinametoda izte klase koju trebate prekritije filterRGB ()
public abstract int filterRGB (int x, int y, int rgb)
int green =
rgb & 0x0000FF00;
green >>>= 8;
int blue =
rgb & 0x0000FF;
int r = (int) (red * fraction );
int g = (int) (green * fraction );
int b = (int) (blue * fraction );
return (0x000000FF << 24) | (r << 16) | (g << 8) | b;
}
}
import java.awt.*;
import java.awt.image.*;
import java.applet.*;
Audio
Java omogucujeizvodenjeaudiodatoteka kodiranihu odredenimformatima. To mogu
bitiAIFF, AU, WAV, MIDI, and RMF datoteke.
Klasa java.applet.Applet sadridvijemetode pomocukojihmoeteskinutizvucnu
datoteku sa nekog URL-a i izvestije.
public void play(URL soundfile )
public void play(URL directory , String filename )
</APPLET>
Kontinuirana izvedba
Umjestopojedinacneizvedbeod pocetka do kraja, applet moeizvoditizvucniprimjer
kontinuirano,tako da ga ucitau objekt "tipa" java.applet.AudioClip (primijetiteda
je to sucelje, ne klasa!) i nakon toga izvvodipomocumetode loop(). Prvo treba snimiti
zvuku AudioClip na primjerovako:
AudioClip ac = this.getAudioClip (new URL(
"http://student .math.hr/~vedris/java/sounds/spacemusic .au"));
Deseto predavanje
ulaz i izlaz
to je Stream?
Stream je nizpodataka koji imaneodredenuduljinu. Nazivstream(struja, tok) je
odabran jer ta strukturanalikujestrujivode koja neprekidnotece i nemadefiniranog
kraja. Jo bolja analogijaje rep (red cekanja). Za vrijemedok se usluujuljudina
pocetku repa, novidolazena njegovkraj. Rep je diskretnastruktura, alito ne znacida
njegoviclanovinisumedusobnopovezaniraznimrelacijama.
U Javise streamsastojiod nizadiskretnihbyteova. Oni mogupredstavljatiznakoveili
neke drugevrste podataka. Mogu dolazitibre nego to ihje moguceobraditiilipak
process moecekati dok ne dode sljedeciza obradu.
Kljucobrade streamaje while petljakoja obraduje svakipojedinielementstreamadok
ne ucitaznak za kraj streamailidok se ne pojavinekidrugiiznimniuvjet. Na Unixuje
<Ctrl-D> znak za zavretakstreama. Windowsza tu svrhukoristi<Ctrl-Z>.
Klase streamova
Gotove sve klase koje izravnorade sa streamovimadijelovisu paketa java.io. (Postoji
takoder nekolikododatnihu paketimasun.io i sun.net , alite su namjernoskrivene.
Ima i nekolikoklasa u paketu java.util.zip .) Dvijeglavneklase su
java.io.InputStream i java.io.OutputStream . To su apstraktneklase i one cine
temeljmnogihpotklasa sa specijaliziranim
mogucnostima
. Medu njimase najcece
koriste:
BufferedInputStream
BufferedOutputStream
ByteArrayInputStream
ByteArrayOutputStream
DataInputStream
DataOutputStream
FileInputStream
FileOutputStream
FilterInputStream
FilterOutputStream
LineNumberInputStream
ObjectInputStream
ObjectOutputStream
PipedInputStream
PipedOutputStream
PrintStream
PushbackInputStream
SequenceInputStream
StringBufferInputStream
Klasa InputStream
Klasa java.io.InputStream je apstraktnaklasa koja sadriosnovnemetode za
citanjecistihbyteovapodataka izstreama. Iako je to apstraktnaklasa, mnogemetode u
bibliotecivracajuobjekt tipa InputStream , tako da cete cesto trebatiraditidirektnos
nekomod metoda deklariranihu toj klasi.
public abstract int read() throws IOException
public int read(byte[] data) throws IOException
public int read(byte[] data, int offset, int length) throws
IOException
public long skip(long n) throws IOException
public int available () throws IOException
public void close() throws IOException
public synchronized void mark(int readlimit )
public synchronized void reset() throws IOException
public boolean markSupported ()
Citanje byteova
Osnovna read() metoda izklase java.io.InputStream cita pojedinacnineoznaceni
byte podataka i vraca njegovuint vrijednost. To je broj izmedu0 i 255. Kad se naide
na kraj streama, vraca se -1, i to moetekoristitikao flagpomocukojeg cete ustanoviti
da ste dolido kraja streama.
public abstract int read() throws IOException
}
}
% javac Echo.java
% java Echo
abcdefg
abcdefg
<Ctrl-C>
%
Preskakanje byteova
Metoda skip() cita i odbacuje specificiranibroj byteova.
public int skip(long n) throws IOException
Markiranje i resetiranje
Cesto je korisnoako moeteucitatinekolikobyteova, a zatimse vratitinatragi ucitatiih
ponovo. Na primjer, pri oblikovanjunekog kompajlerane moeteznatida litrebate
ucitatiznak <, <<, ili<<= sve dok ne ucitatedva iliviebyteova. Bilobi korisnoako
biste se moblivratitinatragi ponovo ucitatitoken nakon to ste okrilio kojem se radi.
Dizajniranjekompajlerai problemiparsiranjauvijekosiguravajumnotvoprimjera, no
slicnepotrebe se pojavljujui drugdje.
Neki, aline svistreamovidoputajuvamda markirateodredenupozicijuu streamui onda
se vratitena nju. To se radi pomocusljedecihmetoda:
public synchronized void mark(int readlimit )
public synchronized void reset() throws IOException
public boolean markSupported ()
Zatvaranje streamova
Kad ste zavrilis nekimstreamom, trebalibiste ga zatvoritikako bi se otpustiliresursikoji
su s njimpovezani. Jednomkad je streamzatvoren, svakipokuaj citanjaiznjegaizbacit
ce IOException .
Stream (u ovomslucajuulazni) zatvaratepomocumetode close():
public void close() throws IOException
Izlazni streamovi
Klasa java.io.OutputStream alje ciste byteovepodataka na neko odredite, npr.
konzoluilimreniposluitelj.Ova je klasa apstraktna, isto kao i InputStream . Medutim,
mnogemetode u biblioteciklasa napravljenesu tako da vracajuobjekte tipa
OutputStream umjestoobjekte iznjenihspecificnihpodklasa. Takoder, mnogemetode
klase OutputStream su opcenitokorisne. To su:
public abstract void write(int b) throws IOException
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws
IOException
public void flush() throws IOException
public void close() throws IOException
Citanje iz datoteke
Klasa java.io.FileInputStream predstavljaInputStream koji cita byteoveiz
datoteke. Ima sljedecepublickonstruktorei metode:
public FileInputStream (String name) throws FileNotFoundException
public FileInputStream (File file) throws FileNotFoundException
System.err.println (e);
}
System.out.println ();
} // end for
} // end main
}
% javac Type.java
% java Type "../html/TricksterApplet .html"
<APPLET CODE="TricksterApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
ARCHIVE ="Trickster .jar"
WIDTH=1 HEIGHT=1>
</APPLET>
%
Pisanje u datoteku
Klasa java.io.FileOutputStream predstavljaOutputStream koji upisujebyteoveu
datoteku. Ima sljedecepublickonstruktorei metode:
public FileOutputStream (String name) throws IOException
public FileOutputStream (String name, boolean append) throws
IOException
public FileOutputStream (File file) throws IOException
public FileOutputStream (FileDescriptor fdObj)
public native void write(int b) throws IOException
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws
IOException
public native void close() throws IOException
public final FileDescriptor getFD() throws IOException
} // end main
}
}
catch (IOException e) {
System.err.println (e);
}
} // end for
} // end if
} // end while
} // end try
catch (IOException e) {
System.err.println (e);
}
for (int i = 0; i < args.length; i++) {
try {
fos[i].close();
}
catch (IOException e) {
System.err.println (e);
}
} // end for
} // end main
}
% javac Append.java
% java Append izlaz1.txt izlaz2.txt
a trava je zelena.
<Ctrl-C>
% more izlaz1.txt
nebo je plavo
a trava je zelena.
% more izlaz2.txt
nebo je plavo
a trava je zelena.
%
Filtriranje streamova
Klase java.io.FilterInputStream i java.io.FilterOutputStream su
konkretnepodklase od InputStream i OutputStream koje na nekinacinmodificiraju
podatke osnovnihstreamova. Rijetkocete ihkoristitiizravno, alinjihovesu podklase
iznimnovane, posebno DataInputStream i DataOutputStream .
Filtar-streampovezujetes osnovnimtako da da osnovniproslijeditekonstruktorufiltarstreama. Na primjer, da biste kreiralinoviobjekt tipa DataOutputStream izobjekta
FileOutputStream moglibiste postupitiovako:
FileOutputStream fos = new FileOutputStream ("ln.txt");
DataOutputStream dos = new DataOutputStream (fos);
Filtrirani streamovi
i BufferedOutputStream
Ove klase bufferirajucitanjei pisanjetako da podatke najprijeucitavajuu
spremnik(buffer, interrnopolje byteova). Tako neka aplikacijamoecitati
byteoveizstreamabez pozivanjanative metoda koje izatoga stoje. Podaci se
ucitavajuizbufferailiu njegaupisujuu blokovima, a naknadnipristupi
usmjeravajuse direktnoprema spremniku.
BufferedInputStream
i DataOutputStream
Ove klase citajui piupodatke koji pripadajuprimitivnimJava tipovima, kao i
podatke tipa Stringna nacinkoji ne ovisio maini(Big-endianza integer,
IEEE-754 za floati double, UTF-8 za Unicode)
DataInputStream
PrintStream
GZIPInputStream
i DigestOutputStream
Ovo su klase izpaketa java.security i izracunavajutzv. MessageDigest za
streamovekoristecineku jaku hash funkciju, npr SHA.
DigestInputStream
i CipherOutputStream
Klase su izpaketa javax.crypto koji je dio Java CryptographyExtension
(JCE), standardnogproirenjaJave, a ukljucenje u JavaTM 2 Platform Std.
Ed. v1.4.0. i izracunavajuenkripcijei dekripcijestreamovakoristecirazne
algoritmekao DES, RSA, Blowfishi druge.
CipherInputStream
i ObjectOutputStream
Podklase od of DataInputStream i DataOutputStream koje mogu
serijaliziratii deserijaliziratiJava objekte u ciste byteove(i obratno). Koristise
kod udaljenogpozivanjametoda (RMI) i za JavaBeans.
ObjectInputStream
Bufferirani streamovi
Klase java.io.BufferedInputStream i java.io.BufferedOutputStream
omogucujucitanjei pisanjena nacinda se podaci prvo spremajuu spremnik(buffer) koji
je zapravointernopolje byteova. Programtada cita byteoveizstreamabez prethodnog
pozivanjanative metode dok god imapodataka u spremniku. Podaci se citajuiz
spremnikailipiuu njegau blokovima, a nakon toga su dostupniizravnoizspremnika.
Sa stanovitaprogramera, jedinarazlikaizmeduobicnogi bufferiranogstreamaje u
konstruktorima:
public
public
public
public
deklarirasljedecekonstruktorei metode:
public
public
public
public
public
public
public
public
public
Klasa PrintStream
Klasa java.io.PrintStream je podklasa od FilterOutputStream . Implementirana
je u System.out i System.err . Omogucujejednostavanispisprimitivnihvrijednosti,
objekata i stringliterala. Za konvertiranjeznakovau byteovekoristikodiranjekoje je na
danoj platformidefault.
Ta klasa ce uhvatitisve iznimketipa IOException , Status pogreke moeteuvijek
doznatipomocumetode checkError (). Ona ce vratititrue ako se greka pojavila,
false inace.
public boolean checkError ()
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
print(boolean b)
print(int i)
print(long l)
print(float f)
print(double d)
print(char s[])
print(String s)
print(Object obj)
println ()
println (boolean x)
println (char x)
println (int x)
println (long x)
println (float x)
println (double x)
println (char x[])
println (String x)
println (Object x)
Klasa PushbackInputStream
Klasa PushbackInputStream osiguravapushback spremnikpomocukojeg je moguce
"ponititi" citanjebyteovasa streama. Kod sljedecegcitanjasa streamabit ce ucitaniti
poniteni byteovi.
public void unread(int b) throws IOException
public void unread(byte[] data, int offset, int length) throws
IOException
public void unread(byte[] data) throws IOException
Klasa File
Klasa java.io.File predstavljaeksterno imedatoteke na racunalu. Njome se
pokuavajuapstrahiratidijeloviimenakoji su zavisnio racunalu, na primjerput, separator
i slicno.
Dva su nacinareferenciranjadatoteka, relativnii apsolutni. Apsolutnoimenovanjedaje
potpuniput do datoteke, poceviod imenadiska pa dalje. Detaljioviseo operacijskom
sustavu. Na primjer:
Unix:
DOS:
MacOS:
"/math/vedris/file1"
"C:\math\vedrisfile 1"
"Macintosh HD:math:vedris:file1"
Napomena za C programere
Primijetiteda objekt tipa File nijeisto to i file handle. Postojanjetakvogobjekta nije
ekvivalentnopostojanjustvarnedatoteke na disku. Postoje metode kojimamoete
utvrditida lidani File objekt zaistareferencirastvarnudatoteku iline (metoda exists
() ).
koji se ponaa kao i prethodni, alije dir ovdje objekt tipa File , a ne naprosto String .
Neke metode u drugimklasamatakoder vracajuobjekt tipa File , na primjermetode iz
klase java.awt.FileDialog . Takvice objektipotovatisve konvencijeoperacijskog
sustavana kojem se aplikacijaizvrava.
Metoda isAbsolute () vraca true ako je dano imeapslolutniput, a false ako nije.
public long lastModified () throws SecurityException
Metoda mkdirs() za dano imekreira ne samo jedan, nego sve potrebne nadredene
direktorijekoji cineput do datoteke. Ako sva kreiranjauspiju, vratitce se true , inace
false (cak ako su neka kreiranjai uspjela).
public boolean renameTo (File destination ) throws SecurityException
Klasa FileDialog
Klasa java.awt.FileDialog je podklasa od java.awt.Dialog koja se koristiza
otvaranjeilispremanjedatoteka. Ona korististandardnedijalogeza open i save koji vec
postoje na racunalu. Ne dodajete joj komponentei ne brinetese o tome kako je
implementiranainterakcijas korisnikom. Jednostavnodobijeterezultatkoji ce bitiimei
direktorijdatoteke. Buducida se appletine moguoslonitina to da imajudostup u file
system, ova je klasa korisnauglavnomu aplikacijama.
Trisu koraka potrebna da biste koristiliFileDialog :
1. Kreiratinovi FileDialog
2. UcinitiFileDialog vidljivim
.
3. Odabrati imedirektorijai imedatoteke.
Novi objekt tipa FileDialog kreiratepomocukonstruktora:
public FileDialog (Frame parent, String title, int mode)
Klasa RandomAccessFile
Pomocuklase java.io.RandomAccessFile pristupase datotekamakoje podravaju
slucajnipristup. One se mogucitatiilise u njihmoepisatipoceviod odredene pozicije
bytea u datoteci. Tu pozicijuspecificirapokazivacdatoteke (file pointer).
Dva su konstruktorau ovoj klasi:
final
final
final
final
final
final
final
final
final
void
void
void
void
void
void
void
void
void
Sucelje FilenameFilter
Sucelje java.io.FilenameFilter deklarirasljedecumetodu:
public boolean accept(File directory , String filename )
OK
Java source datoteka
% java JavaFilterTest "." "JavaFilter .class"
Nije Java source datoteka
%
Klasa Reader
Metode izklase java.io.Reader namjernosu napravljenetako da budu slicne
metodamaizklase java.io.InputStream . Medutim, umjestoda rade s byteovima,
one rade sa znakovima(char ).
Osnovna read() metoda cita pojedinacniznak (koji moezauzimatiod jednogdo cetiri
bytea, ovisnoo znakovnomsustavu) i vraca ga kao intizmedu0 i 65535. Ako naidena
kraj strama, vraca -1.
public int read() throws IOException
Sve read() metode blokirajuse ako nijedostupannekiinput, ako se pojaviI/O error ili
ako naiduna kraj streama.
Moete preskocitiodredenibroj znakovapomocumetode skip(). Ona ce se takoder
blokiratiako nemadostupnoginputa. Vraca broj preskocenihznakovaili-1 ako je naila
na kraj streama.
public long skip(long n) throws IOException
Metoda ready() vraca true ako je Reader spremanza citanje, false inace. Opcenito
ce to bitiako pripadnistreamimadostupnihpodataka.
public boolean ready() throws IOException
Reader moeiline mora podravatimarkiranjei resetiranje. Metoda markSupported ()
vraca true ako pripadnistreampodravamarkiranjei resetiranje, false inace.
public boolean markSupported ()
public void mark(int readAheadLimit ) throws IOException
public void reset() throws IOException
Klasa Writer
Metode izklase java.io.Writer namjernosu napravljenetako da budu slicne
metodamaiz java.io.OutputStream . Medutim, umjestoda rade s byteovima, one
rade sa znakovima(char ).
Osnovna write() metoda ispisujepojedinacniznak od dva bytea s vrijednocuizmedu
0 i 65535. Vrijednostse uzimaizdva niabytea argumentac (preostaladva viabytea se
ignoriraju). Podklase koje eleefikasnopisatiznakovemorat ce prekritiovu metodu.
public void write(int c) throws IOException
Klasa InputStreamReader
Klasa java.io.InputStreamReader sluikao most izmedustreamovabyteovai
streamovaznakova. Cita byteoves ulaznogstreamai prevodiihu znakoveu skladusa
zadanimznakovnimsustavom.
Znakovnisustav(encoding) moese zadatiu konstruktoruilise moeprihvatitidefault
sustavs racunala.
public InputStreamReader (InputStream in)
public InputStreamReader (InputStream in, String encoding ) throws
UnsupportedEncodingException
Klasa OutputStreamWriter
Klasa java.io.OutputStreamWriter povezujeizlaznebyte streamovei znakovne
streamove. Ispisujebyteovena pripadniizlaznistreamnakon prevodenjaznakovau
skladusa zadanimznakovnimsustavom.
Ime
8859_3
8859_4
8859_5
8859_6
8859_7
8859_8
8859_9
Big5
CNS11643
Cp037
Cp273
Cp277
Cp278
Cp280
Cp284
Cp285
Cp297
Cp420
Cp424
Cp437
Cp500
Cp737
Cp775
Cp850
Cp852
Cp855
Cp856
Cp857
Cp860
Cp861
Cp862
Cp863
Cp864
Cp865
Cp866
Cp868
Cp869
Znakovnisustav
ISO 8859-3 (LatinExtended-B) Pinyin, Sami, Croatian, and a few
others
ISO 8859-4 (LatinExtended-C)
ISO 8859-5 Latin/Cyrillic
ISO 8859-6 Latin/Arabic
ISO 8859-7 Latin/Greek
ISO 8859-8 Latin/Hebrew
ISO 8859-9 Latin/Turkish
The Big5 encodingfor Chinese
Chinese
EBCDIC AmericanEnglish
IBM273
EBCDIC Danish/Norwegian
EBCDIC Finnish/Swedish
EBCDIC Italian
EBCDIC Spanish
EBCDIC UK English
EBCDIC French
EBCDIC Arabic1
EBCDIC Hebrew
the originalDOS IBM PC characterset, essentiallyASCII witha
few extra charactersfor drawinglinesand boxes
EBCDIC Flemish/Romulsch
DOS Greek
DOS Baltic
DOS Latin-1
DOS Latin-2
DOS Cyrillic
IBM856
DOS Turkish
DOS Portuguese
DOS Icelandic
DOS Hebrew
DOS CanadianFrench
DOS Arabic
IBM865
IBM866
EBCDIC Arabic
DOS modernGreek
Cp870
EBCDIC Serbian
Cp871
EBCDIC Icelandic
Cp874
WindowsThai
Cp875
IBM875
Cp918
EBCDIC Arabic2
Cp921
IBM921
Cp922
IBM922
Cp1006
IBM1006
Cp1025
IBM1025
Cp1026
IBM1026
Cp1046
IBM1046
Cp1097
IBM1097
Cp1098
IBM1098
Cp1112
IBM1112
Cp1122
IBM1122
Cp1123
IBM1123
Cp1124
IBM1124
Cp1250
WindowsEasternEuropean(essentiallyISO Latin-2)
Cp1251
WindowsCyrillic
Cp1252
WindowsWestern European(essentiallyISO-Latin-1)
Cp1253
WindowsGreek
Cp1254
WindowsTurkish
Cp1255
WindowsHebrew
Cp1256
WindowsArabic
Cp1257
WindowsBaltic
Cp1258
WindowsVietnamese
EUCJIS
Japanese EUC
GB2312
Chinese
JIS
Japanese Hiragana
JIS0208
Japanese
KSC5601
Korean
MacArabic
The MacintoshArabiccharacterset
MacCentralEuropeThe MacintoshCentralEuropeancharacterset
MacCroatian
The MacintoshCroatiancharacterset
MacCyrillic
The MacintoshCyrilliccharacterset
MacDingbat
Zapf Dingbats
MacGreek
The MacintoshmodernGreek characterset
MacHebrew
The MacintoshHebrew characterset
MacIceland
The MacintoshIcelandiccharacterset
MacRoman
The MacintoshRomancharacterset
MacRomania
MacSymbol
MacThai
MacTurkish
MacUkraine
SJIS
UTF8
Unicode
UnicodeBig
The MacintoshRomaniancharacterset
The Symbolfont(includesa completeGreek alphabetinplace of the
usualRomanletters)
The MacintoshThaicharacterset
The MacintoshTurkishcharacterset
The MacintoshUkrainiancharacterset
WindowsJapanese
UCS TransformationFormat, 8-bit form
NormalUnicode
Unicodewithbig-endianbyte order
Klasa FileWriter
Klasa java.io.FileWriter sluiza pisanjetekstualnihdatoteka koristeci
pretpostavljeniznakovnisustavi velicinuspremnikas platforme. Ako elitepromijenitite
vrijednosti, konstruirajteOutputStreamWriter i prikljucitega na FileOutputStream .
Ova klasa nemavlastitihmetoda (samo naslijedene), a deklariranisu samo konstruktori.
public FileWriter (String fileName ) throws IOException
public FileWriter (String fileName , boolean append) throws
IOException
public FileWriter (File file) throws IOException
public FileWriter (FileDescriptor fd)
Pogledajmoprimjer:
FileWriter fw = new FileWriter ("izlaz.txt");
Klasa FileReader
The java.io.FileReader sluiza citanjetekstualnihkoristecipretpostavljeniznakovni
sustavi velicinuspremnikas platforme. Ako elitepromijenitite vrijednosti, konstruirajte
InputStreamReader i prikljucitega na FileInputStream . Ova klasa nemavlastitih
metoda (samo naslijedene), a deklariranisu samo konstruktori.
public FileReader (String fileName ) throws FileNotFoundException
public FileReader (File file) throws FileNotFoundException
public FileReader (FileDescriptor fd)
Pogledajmoprimjer:
Klasa BufferedReader
Klasa java.io.BufferedReader je podklasa od java.io.Reader koju moete
ulancitis drugomReader klasomzbog bufferiranjaznakova. To omoucujeefikasnije
citanjeznakovai linija.
Klasa BufferedReader takoder je znacajnai zbog svoje readLine () metode koja
omogucujecitanjeteksta linijupo liniju.
Kod svakog citanjas nebufferiranogReader a, obavljase i odgovarajucecitanjes
pridruenogulaznogstreama. Zato nijeloa ideja prikljucitiBufferedReader na svaki
Reader cije su operacijecitanjaskupe, kao npr. za FileReader . Na primjer,
BufferedReader br = new BufferedReader (new FileReader ("ulaz.txt"));
} // end while
} // end try
catch (IOException e) {
System.err.println ("Error: " + e);
}
} // end for
} // end main
}
% javac cat.java
% java cat "../html/TricksterApplet .html" "../html/
GridBagCalculator .html"
<APPLET CODE="TricksterApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
ARCHIVE ="Trickster .jar"
WIDTH=1 HEIGHT=1>
</APPLET>
<APPLET CODE="GridBagCalculatorApplet .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
ARCHIVE ="GridBagCalculator .jar"
WIDTH=1 HEIGHT=1>
</APPLET>
%
Klasa LineNumberReader
Klasa java.io.LineNumberReader je podklasa od java.io.BufferedReader koja
vodiracunao tome s koje linijetrenutacnocitate. Ima sve metode kao i
BufferedReader ukljucjujcii readLine () . Ima dva konstruktorai dvijenove metode,
getLineNumber () i setLineNumber () :
public LineNumberReader (Reader in)
public LineNumberReader (Reader in, int size)
public void setLineNumber (int lineNumber )
public int getLineNumber ()
Klasa BufferedWriter
There are two constructors, one witha defaultbuffersizeof 8192 characters, and one
that lets you specifythe buffersize:
public BufferedWriter (Writer out)
public BufferedWriter (Writer out, int size)
Klasa PrintWriter
Klasa java.io.PrintWriter je podklasa od java.io.Writer koja omogucuje
koritenjepoznatihmetoda print() i println (). Vrlo je slicnaklasi
java.io.PrintStream . Glavnarazlikaje u pravilnomrukovanjuviestrukimbyteovima
i znakovnimsustavimakoji nisuISO Latin-1. Drugarazlikaje u tome to se automatski
ispis(flushing) obavljatek kad se pozove neka od println () metoda, a ne svakiput
kad se pojaviznak za noviredak.
Tendencijaproizvodacaje izbacitiizuporabe PrintStream i umjestonjegakoristiti
PrintWriter , no to bi dovelodo pucanjavelikekolicinevec postojecegkoda.
public
public
public
public
void
void
void
void
void
write(int c)
write(char buf[], int offset, int length)
write(char buf[])
write(String s,
write(String s)
public
public
public
public
public
public
public
public
public
void
void
void
void
void
void
void
void
void
print(boolean b)
print(char c)
print(int i)
print(long l)
print(float f)
print(double d)
print(char s[])
print(String s)
print(Object obj)
public
public
public
public
public
public
public
public
public
public
void
void
void
void
void
void
void
void
void
void
println ()
println (boolean x)
println (char x)
println (int x)
println (long x)
println (float x)
println (double x)
println (char x[])
println (String x)
println (Object x)
Multitasking i multithreading
Prvikompjuterimoglisu obavljatizadace samo jednupo jednu. Svi su se programi
izvravalisekvencijalno, jedan po jedan i svakije zauzimaosve resurse racunala. Takav
se nacinrada nazivabatch obrada. To je efikasannacinza postizanjemaksimalne
iskoristivostiskupihracunalajer se gotovosve CPU vrijemetroina stvarnuobradu.
Medutim, batch obrada je nepovoljnaako programikoji traju nekolikosekundimoraju
cekati na zavretakprogramaod nekolikodana.
Time sharing operacijskisustavisu izmiljenikako bi se omoguciloda vieljudi
istodobnokoristijedno racunalo. Operacijskisustavovdje upravljaraspodjelomvremena
izmedurazlicitihprogramakoji se istodobnoizvravaju.
Jednomkad su sustaviomogucavalirazlicitimkorisnicimaistodobnoizvravanje
programa, preostao je jo samo malikorak do toga da istikorisnikizvravaistodobno
vieprograma(multitasking). Svakiaktivniprogram, uobicajenoje reci proces, imaoje
svoj vlastitimemorijskiprostor, svoj skup varijabli, svoj stack i heap i tako dalje. Jedan
process je mogaolansiratidrugiprocess, alinakon toga svakiod njihse ponaao manjeili
vienezavisno. Mehanizmikao to je pozivudaljenihprocedura (remote procedure call,
RPC) razvijenisu kako bi omoguciliprocesimamedusobnuinterakciju, alitakva je
interakcijabilaskupa i komplicirana. Takvo stanje potrajaloje nekihdvadesetak godina.
Medutim, nisusamo korisniciti koji imajupotrebu obavljativieposlovaistodobno.
Mnogiprogramipo svojoj su priroditakoder takvi. Web browser na primjer, moe
ispisivatidatoteku u pozadinidok istodobnoskida stranicuu jednomprozorui formatira
je kako sadraj pristie. Sposobnost individualnogprogramada radi vieod jedne stvari
istodobnonajefikasnijese implementirakroz koncept threadova(multithreading).
to je thread?
Klase threadova
U Javipostoje dva nacinada klasupretvorimou thread. Jedan je da je ucinimo
podklasomklase java.lang.Thread . Ako je naa klasa vec podklasa neke druge
klase, onda to, naravno, nece bitimoguce, pa cemo koristitidruginacin, a to je
implementiranjesucelja java.lang.Runnable .
Klasa Thread imatri glavnemetode koje se koristeza upravljanjethreadovima:
public native synchronized void start()
public void run()
public final void stop()
Jednostavni thread
Kad piete programkoji sadrithreadove, moetezamiljatida piete vierazlicitih
programaod kojihsvakiimasvoju run() metodu. Pogledajmoslucajkad je svakitakav
thread podklasa od java.lang.Thread . Sljedeciprogramje thread koji ispisuje
brojeve iod-10 do 9.
public class BytePrinter extends Thread {
public void run() {
System.out.println ("pocinjem !");
Viestruki threadovi
Sljedeciprogramlansiratri threada tipa BytePrinter :
public class ThreadsTest {
public static void main(String args[]) {
BytePrinter bp1 = new BytePrinter ();
BytePrinter bp2 = new BytePrinter ();
BytePrinter bp3 = new BytePrinter ();
bp1.start();
bp2.start();
bp3.start();
}
}
Imenovanje threadova
Cesto je korisnodati razlicitimthreadovimaiste klase imenapo kojimaihmoete
razlikovati. Sljedecikonstruktorklase Thread vamto omogucuje:
public Thread(String name)
Prioriteti threadova
Nisu svithreadovijednako vani. Ponekad je potrebno nekomthreadudodijelitivie
vremenanego drugom. Threadovikoji komunicirajus korisnikomtrebajuimativrlovisok
Frank: 9
Frank: gotovo!
%
Metoda sleep()
Ponekad je brzinaizvrvanjaveca nego to elite. U tom slucajubit ce potrebno usporiti
izvravanjepojedinihthreadova. To se radi pomocumetode sleep():
public static void sleep(long millis) throws InterruptedException
Ovdje je millis broj milisekundikoji treba proci prije nego thread nastavis
izvravanjem
. Metoda sleep() moeodbacitijava.lang.InterruptedException
koju je potrebno uhvatitipa pozivove metode mora bitiunutartry-catch bloka. Na
primjer, ako elimoodgoditiizvravanjeza jednusekundu, stavilibismo:
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
Sinkronizacija: problem
Do sad smo promatralithreadovekoji se izvravajunezavisnojedan od drugoga. Ni
jedan thread nijemorao znatito rade ostali. Ponekad, medutim, threadovimorajudijeliti
podatke. U tom slucajuvanje osiguratida jedan thread ne promijenipodatke u vrijeme
dok ihdrugithread koristi. Klasicniprimjerje pristupdatoteci. Ako jedan thread pie u
datoteku u vrijemedok je drugithread cita, vjerojatnoje da ce ovaj drugithread dobiti
nekonzistentnepodatke. Promotrimo, na primjer, sljedeciproblem:
public class Counter {
int i = 0;
public void count() {
int limit = i + 100;
while (i++ != limit)
}
System.out.println (i);
}
public class CounterThread extends Thread {
Counter c;
public CounterThread (Counter c) {
this.c = c;
}
System.out.println (i);
Sinkroniziranje na objektima
Svakomobjektu dodijeljenje tzv. monitor. Kad kljucnurijec synchronized primjenite
na neku metodu, dobijetemonitorodredenogobjekta, odnosno zakljucavatega. Dok
god jedan thread posjeduje monitor, odnosno lokot nekog objekta, nijedan drugithread
ne moedobititaj lokot. (Drugithreadovice, eventualnomocidobitilokote drugih
objekata iziste klase).
Kad koristitekljucnurijec synchronized kako biste specificiralida je neka metoda
sinkronizirana
, zakljucavateodredeniobjekt kojemuta metoda pripada. (Statickemetode
mogutakoder bitisinkronizirane
. U tom slucajulokot se stavljana objekt izklase
java.lang.Class koji je pridruenklasivaegobjekta.) Kako postojisamo jedan
lokot za svakiobjekt, nijesamo sinkroniziranametoda ta koju ne mogupozvatiostali
threadoviistodobno. Takoder se to odnosina ostale inkroniziranemetode iliblokove
koda u tom objektu.
Sinkroniziratimoetei na niimrazinamanego to je razinametode. Na primjer, sljedeci
programiamobi problemaako bi drugithread promijeniovrijednostod i ilithis.i u
vrijemedok se obavljapridruivanje
.
public class Counter {
int i = 0;
public void count() {
int i = this.i;
int limit = i + 100;
System.out.println (i);
}
}
Primarni thread
U pravilu, prilikomizvravanjaJava programaaktivnasu bar tri threada. Najprije, tu je
glavnithread unutarkojeg se va programizvrava. To je thread koji ukljucujemain()
metodukoja je pokrenulavau aplikaciju. U appletu, to ce bitithread unutarkojeg su
lansiraniapplet vieweriliweb browser.
Zatim, tu je garbage collector, thread koji za programomcistimemorijui obavljarazne
finalizacije
. Taj thread u praviluimaniskiprioritet.
U programimakoji koristeAWT aktivanje jo jedan thread koji se brineo auriranju
ekrana i otprilike100 puta u sekundiprovjeravatreba lineto bitiobnovljeno(repainted)
.
Konacno, tu su svithreadovikoje eksplicitnopokrene va program. U svako doba
programradi u nekomthreadui nikadne izlaziizsustavathreadova. Moete ustanoviti
koji thread se trenutnoizvravapomocustatickemetode currentThread ():
public static Thread currentThread ()
Grupe threadova
Threadovi demoni
Threadovikoji rade u pozadinikao podrka runtime okruenjunazivajuse demoni
(daemon threads). Na primjer, clock handler, idle, garbage collector, screen updater
su demoni. that work inthe backgroundto support the runtimeenvironmentare called
daemon threads. Virtualnamainase zaustavljakad su svinon-demonthreadovizavrili.
Ustupanje kontrole
Buducida u pravilune moetepredvidjetida lice va programraditiu kooperativnomili
natjecateljskom(preemptive) okruenju, treba omogucitida threadovikoji intenzivno
koristeCPU s vremenana vrijemeprepuste kontroluostalimthreadovima. Cetirisu
situacijeu kojimace thread prepustitikontrolu:
ako je blokiran.
Ako je ustupiokontrolupomocumetode yield().
Ako je uspavanpomocumetode sleep().
Ako je suspendiran(to izbjegavajte: metode suspend () i resume() su
depricated).
Blokiranjenastajeako thread mora cekati da se neka operacijazavri. Obicno su to I/O
operacije, posebno one koje ukljucujupristuppreko mree. Moguceje blokiranjei zbog
cekanja na korisnikovunos. Obicno je dobro stavitiI/O operacijeu odvojenethreadove
visokogprioritetajer ce racunalona taj nacinbitiefikasnijeiskoriteno. Ostalithreadovi
koji intenzivnokoristeCPU obavitce mnogoposla dok cekaju na podatke koji trebaju
doci preko mreeiliod korisnikakoji treba neto utipkati.
Kad aktivnithread pozove metodu yield(), on ce se privremenozaustavitii ustupiti
kontroludrugimthreadovima. Virtualnamainace potraitiimalithreadovaistogilivieg
prioritetakoji cekaju i ako ima, dodijelitce kontrolusljedecemu redu. Ako nema,
kontrolace se vratitithreadukoji ju je prepustio. Znacida yield() samo signalizira
spremnostza preputanjekontrolei ne garantirada ce thread zaistabitizaustavljen. To
ovisiu potpunostio drugimthreadovima.
Ako thread bezuvjetnoelipredatikontroluna neko vrijeme, bez obzirada lidrugi
threadovicekaju iline, on moepozvatimetodu sleep(). Ona ce ga uspavatina
odredeno vrijemetijekomkojega drugithreadoviimajuprilikuza izvravanje.
public static void sleep(long milliseconds ) throws
InterruptedException
public static void sleep(long milliseconds , int nanoseconds )
throws InterruptedException
Spajanje threadova
Spajanje threadovaznacida jedan thread ceka dok drugine zavri. Za to postoje tri
overloaded join() metode koje blokirajuthread koji ihje pozvao, tako dugo dok se
thread cija join() metoda je pozvanane ugasi.
public final void join() throws InterruptedException
public final void join(long milliseconds ) throws
InterruptedException
public final void join(long milliseconds , int nanoseconds )
throws InterruptedException
Sucelje Runnable
Do sada su svithreadovis kojimasmo radilibilipodklase od java.lang.Thread .
Ponekad, medutim, eliteda se kao threadoviponaajui klase koje su vec podklase
drugihklasa. Tipicanprimjerje kad eliteda se applet ponaa kao thread. U takvim
slucajevimaimplementiratcete u vaoj klasisucelje java.lang.Runnable . Ono
deklarirajednujedinumetodu, run().
public void run()
Sad cete prvo kreirativa Runnable objekt, a zatimnoviobjekt tipa Thread tako da
kao argumentkonstruktorudate va objekt. Nakon toga moetepozvatistart()
metoduizklase Thread :
MyThreadedClass mtc = new MyThreadedClass ();
Animacija
Animacijaje jedna od glavnihprimjenasucelja Runnable . Da biste pokrenuliobjekte u
Javi, kreiratethread koji racunasukcesivneframeove na ekranui pozivametodu
repaint () za obnovuslike. Moete takoder postavitii beskonacnupetljuu vau paint
() metodu, alito nijedobro, osobito na non-preemptivesustavimakao to je Mac. To
takoder ne osiguravadobru pravovremenost(timing).
Pocnimosa jednostavnomanimacijomodbijanjacrveneloptice(prikazanekao krug) od
unutranjihrubovakutije(prikazanekao pravokutnik). Njene koordinatebit ce
spremljeneu atributur koji je tipa java.awt.Rectangle . Metoda paint() gledatce
taj pravokutniki iscrtatimuupisanikrug.
Appletovarun() metoda mjestoje gdje se akcija zapravodogada. Ovdje ce se
povecavatikoordinatelopticei provjeravatida lise ona primaklarubu vidljivogpodrucja.
Ako jest, odgovarajucakoordinatace se smanjivati.
import java.awt.*;
import java.applet.*;
}
<APPLET CODE="Bounce.class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=200 HEIGHT=100>
</APPLET>
Pravovremenost
Prava animacijamora osiguratimehanizam
pravovremenosti.Animacijakoju smo upravo
napravilibit ce na nekimsustavimaprebrza, a na
nekimamodai prespora. Potrebno je na nekinacin
reguliratitu brzinu.
Filmskistandard je 24 framea u sekundi. Filmovise
tom brzinomi snimaju, a kod projekcijene elimoda
brzinaprojektora utjece na brzinuizmjeneframeova,
pogotovoako razlicitiprojektoriimajurazlicitebrzine. To je, inace, razlog, zato stari
nijemifilmoviizgledajuneprirodnobrzo. Oni su snimanibrzinomod 15 frameovau
sekundi, dok dananjiprojektorirade sa 24 frameau sekundi. Televizijskaslikase
obnavljabrzinomod 30 frameovau sekundina vie.
Iako ne moeteubrzatianimacijuiznadmogucnostivirtualnemaine, moeteje usporiti
koristecimetodu sleep(). Sljedeciapplet ogranicavabrzinukretanjalopticena 50
pixela(vertikalnoi horizontalno) u sekundi.
import java.awt.*;
import java.applet.*;
import java.util.*;
Titranje slike
Moda ste primijetilititranjeslikekod izvravanjaovog appleta. To je uobicajeniproblem
animacijskihappleta. Nastaje zbog nesinkroniziranosti
obnavljanjaslikena fizickom
ekranui obnavljanjaslikekoje diktiraapplet. Kad to dvoje nijeu skladu, nastajetitranje.
Dva su nacinana koje moeterijeititaj problem. Najjednostavnijerjeenjeje definiranje
tzv. clipping podrucja. To je pravokutnikunutarkojeg moetecrtati, a izvannjegane
moete. Definiranjemclipping podrucja omedujeteprostor u koji moetecrtati. To znaci
da nitaizvantog podrucja nece titrati. Titranjeje ogranicenosamo na to podrucje.
Nadalje, malapovrinase moebrzo iscrtatipa je i vjerojatnosttitranjamanja.
Da biste definiraliclipping pravokutnik, pozvatcete metodu g.clipRect (Rect r)
unutarvae paint(). Ovaj applet je upravoi pogodan za to jer vec imagotov
pravokutnikkoji treba biticlipping. Pogledajmosada revidiraniapplet:
import java.awt.*;
import java.applet.*;
import java.util.*;
Rectangle r;
int deltaX = 1;
int deltaY = 1;
int speed = 50;
public void init () {
r = new Rectangle (37, 17, 20, 20);
Thread t = new Thread(this);
t.start();
}
java.awt.*;
java.awt.event.*;
java.applet.*;
java.util.*;
void
void
void
void
mousePressed (MouseEvent e) {}
mouseReleased (MouseEvent e) {}
mouseEntered (MouseEvent e) {}
mouseExited (MouseEvent e) {}
}
<APPLET CODE="StartStopBounce .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=200 HEIGHT=100>
</APPLET>
import java.awt.*;
import java.applet.*;
public class TwoBall extends Applet implements Runnable {
Ball b1, b2;
Thread t;
//kod za reduciranje titranja
private Image offScreenImage ;
private Dimension offScreenSize ;
private Graphics offScreenGraphics ;
public final synchronized void update (Graphics g) {
Dimension d = this.getSize ();
if((this.offScreenImage == null)
|| (d.width != this.offScreenSize .width)
|| (d.height != this.offScreenSize .height)) {
this.offScreenImage = this.createImage (d.width, d.height);
this.offScreenSize = d;
this.offScreenGraphics = this.offScreenImage .getGraphics ();
}
this.offScreenGraphics .clearRect (0, 0, d.width, d.height);
this.paint(this.offScreenGraphics );
g.drawImage (this.offScreenImage , 0, 0, null);
}
//kraj koda za reduciranje titranja
try {
Thread.sleep(10);
}
catch (InterruptedException e) {
}
}
}
}
class Ball extends Thread {
private
private
private
private
Rectangle r;
int deltaX = 1;
int deltaY = 1;
Dimension bounds;
}
}
}
<APPLET CODE="TwoBall .class"
CODEBASE ="http://student .math.hr/~vedris/java/classes "
WIDTH=200 HEIGHT=100>
</APPLET>
u pripremi
Dvanaesto predavanje
programiranje
Portovi protokoli internet adrese
InetAddress objekata URL -
mreno
parsiranje
Portovi
U pravilu(koje imamnogoiznimaka) svako racunaloimasamo jednuInternetadresu.
Medutim, svako racunalocesto treba komuniciratis vieod jednogracunalaistodobno.
Na primjer, u isto vrijememoese odvijatinekolikoftp sesija, nekolikoweb konekcija,
chat i tako dalje.
Da bi se to omogucilo, mrenosuceljeracunalapodijeljenoje na 65536 ulaza, takozvanih
portova. Port je apstrakcija. To nijenikakvifizickiulazkao to su serijskiiliparalelni
portovina osobnimracunalima. No podaci putujuInternetomu paketima, pri cemusvaki
paket nosine samo adresu hosta nego i broj porta na koji treba stici. Host ce na osnovi
specificiranogporta odreditikojem programuje namijenjendoticnipaket podataka.
Ako elite, IP adresu moetezamiljatikao ulicnuadresu, a portove kao brojeve stanova
u kucama. Routerikoji transportirajupakete brinuse samo o ulicnojadresi , dakle ne
citajubroj porta. To je preputenolokalnomracunalu.
Na Unixupotrebne su vamroot privilegijeza oslukivanjekonekcijana portovimaod 0
do 1023. Konekcijena portovimaod 1024 do 65535 moeoslukivatisvatko, dok god
odredeniport nijezauzet(na istomportu ne moevieod jednogprogramaistodobno
oslukivatikonekcije). Na operacijskimsustavimaWindowsNT, Windows95 i Mac bilo
koji korisnikmoebez posebnihprivilegijaoslukivatibilokoji port.
Bilokoji udaljenihost moeostvaritikonekcijuna posluiteljkoji oslukujenekiport
ispod 1024. Nadalje, viestrukesimultanekonekcijemoguse ostvaritina udaljenihost i
udaljeniport. Na primjer, web posluiteljkoji oslukuje(u pravilu) na portu 80 moe
istovremenoobradivatidesetke konekcijaistodobno, sve usmjerenena port 80.
Ukratko, samo jedan process na lokalnomhostumoekoristitinekiport. Naprotiv,
mnogoudaljenihhostovamoeostvarivatikonekcijena jedan te isti(udaljeni) port.
Mnogiservisirade na tzv. opcepoznatim(well-known), portovima. To znacida protokoli
specificirajuda nekiservismoeilimora koristitiodredeniport. Na primjer, http
posluiteljiobicnooslukujuna portu 80, SMTP posluiteljina portu 25, Echo posluitelji
Protokoli
Neformalnogovoreci, protocol definirakakodva hosta medusobnokomuniciraju
. U radio
komunikaciji
, na primjer, protokolispecificirajuda po zavretkuporuke treba reci over
ili kraj . Kod racunalnihmreaprotokol definirato jest, a to nijeprihvatljivoza jednog
ilidrugogsudionikakomunikacijeu odredenomvremenskomtrenutku.
Na primjer, daytime protokol, specificiranu RFC 867, kae da se klijentpovezujes
posluiteljemna portu 13. Posluiteljtada kae klijentutocno vrijemeu formatukoji je za
covjeka citljiv, a nakon toga prekida konekciju.
S drugestrane, time protokol, specificiranu RFC 868, propisujebinarnureprezentaciju
vremenakoja je citljivaza racunala.
Daytime i time aljuistuinformaciju
. Medutim, onikoristerazliciteformatei razlicite
protokole da bi je poslali.
Postojionolikorazlicitihvrsta protokola kolikoimaservisakoji se njimakoriste.
Lockstep protokolitrae jedan odgovor za svakiupit. Neki protokolikao to je FTP
koristeviestrukekonekcija. Vecinakoristisamo jednu. Neki protokoli, kao HTTP
dozvoljavajusamo jedan upiti jedan odgovor po konekciji. Drugi, kao FTP,
dozvoljavajuviestrukekonekcijei vieodgovoraunutarsvake konekcije.
Internet adrese
Svako racunalona Internetuidentificirase pomocujedinstvene, cetverobajtneIP adrese.
Ona se obicnozapisujeu tzv. dotted quad formatukao npr. 161.53.8.14 gdje je svaki
byte neoznacenavrijednostizmedu0 i 255.
Buducida je ovakve brojeve teko zapamtiti, adrese se mapirajuu imenakao
student.math.hr , jagor.srce.hr i tako dalje. Medutim, bitnaje numerickaadresa, ne
ime.
Klasa java.net.InetAddress predstavljatakve adrese. Izmeduostalog, ona sadrii
metode za konvertiranjenumerickihadresa u imenahostovai obrunuto.
public static InetAddress getByName (String host) throws
UnknownHostException
public static InetAddress [] getAllByName (String host) throws
UnknownHostException
public static InetAddress getLocalHost () throws
UnknownHostException
public boolean isMulticastAddress ()
public String getHostName ()
public
public
public
public
public
byte[] getAddress ()
String getHostAddress ()
int hashCode ()
boolean equals(Object obj)
String toString ()
Imat cemo:
% javac HostAddresses .java
% java HostAddresses student .math.hr
student .math.hr/161.53.8.14
student .math.hr/161.53.29.70
%
String getHostName ()
String getHostAddress ()
byte[] getAddress ()
boolean isMulticastAddress ()
Sljedeciprogramispisujepodatke o lokalnomhostu.
import java.net.*;
public class LocalHost {
public static void main(String[] args) {
try {
InetAddress me = InetAddress .getLocalHost ();
System.out.println ("Ime lokalnog hosta -----> " +
me.getHostName ());
System.out.println ("Adresa lokalnog hosta ---> " +
me.getHostAddress ());
byte[] address = me.getAddress ();
System.out.print("Adresa po byteovima -----> ");
for (int i = 0; i < address .length; i++) {
System.out.print(address [i] + " ");
}
System.out.println ();
if (me.isMulticastAddress ())
System.out.println ("multicast ");
else
System.out.println ("nije multicast ");
}
catch (UnknownHostException e) {
System.err.println ("Ne mogu naci trazeni host");
}
}
}
URL
URL, kraticaza "UniformResourceLocator", je nacinza jednoznacnoidentificiranje
lokacijenekog resursa na internetu. TipicniURL-oviizgledajuovako:
http://public.srce.hr/
file:///Macintosh %20HD/Java/Docs/JDK%201.1.1%20docs/api/
java.net.InetAddress .html#_top_
http://www.macintouch .com:80/newsrecent .shtml
ftp://ftp.carnet.hr/pub/
mailto:Mladen.Vedris@student .math.hr
telnet://student .math.hr
Klasa URL
URL-ovisu u Javipredstavljeniklasom java.net.URL . Postoje konstruktoriza
kreiranjenovogURL-a i metode za parsiranjerazlicitihdijelovaURL-a. Ipak, bitnidio
ove klase su metode koje vamomogucujuda sa nekog URL-a dobijete InputStream i
na taj nacincitatepodatke s posluitelja.
Klasa URL usko je povezanas handlerima protokola i sadraja. Ciljje odvojitisnimljene
(downloaded) podatke od protokola koji je koritenza njihovosnimanje. Handler
protokola je odgovoranza komuniciranjesa posluiteljem
, tj. prenoenjebyteovaod
posluiteljado klijenta. On obavljapotrebne pregovore (negotiations) oko posluiteljai
svihpotrebnihheadera. Njegov je posao dobavitibyteovetraenihpodataka. Handler
sadrajapreuzimate byteovei prevodiihu neku vrstuJava objekta kao to je
InputStream iliImageProducer .
You can also constructthe URL by passingits pieces to the constructor, likethis:
URL u = null;
try {
u = new URL("http", "student .math.hr",
"~vedris/java/java-predavanja /javapredavanje -01.htm");
}
catch (MalformedURLException e) {
}
Na primjer,
try {
URL u = new URL("http://student .math.hr/~vedris/java/html/
TricksterApplet .html#top");
System.out.println ("Protokol : " + u.getProtocol ());
System.out.println ("Host
: " + u.getHost ());
System.out.println ("Port
: " + u.getPort ());
System.out.println ("File
: " + u.getFile ());
System.out.println ("Anchor : " + u.getRef());
}
catch (MalformedURLException e) {
}
Uticnice (sockets)
Prije nego se podaci aljupreko Internetas jednoghosta na drugiuz pomoc TCP/IP, oni
se pakirajuu pakete razlicitih
, alikonacnihvelicinakoji se nazivajudatagrami. Velicina
datagramavariraod nekolikodesetaka byteovapa do oko 60,000 byteova. Sve to je
vece od toga, a cesto i ono to je manjeod toga, treba podijelitiu manjedijeloveprije
odailjanja. Prednost takvogslanjapodataka je u tome to ako se jedan paket putem
izgubi, on se moeposlatiponovo bez da se opet aljusviostalipaketi. Takoder, ako
paketi stignuizvanporetka, onise mogupravilnoporedatii kod primatelja.
Ipak, sve je ovo transparentnoza Java programera. Hostov ugradenimrenisoftverce
transparentnoobavitirazdiobupodataka u pakete na stranipoiljateljate ihponovo
spojitina straniprimatelja. Umjestotoga, Java programerse susrece s vrlovisokom
apstrakcijomkoju nazivamouticnica(socket). Uticnicapredstavljapouzdanukonekciju
za prijenospodataka izmedudva hosta. Ona vas izoliraod detaljakodiranjapaketa,
gubitkai ponovnogslanjapoiljki, te uspostavljanjaporetka medupristiglimpaketima.
Uticnicaobavljasljedececetirifundamentalneoperacije:
1. uspostavljanjeveze s udaljenimracunalom
2. slanjepodataka
3. primanjepodataka
4. prekidanjeveze
Uticnicane moebitiprikljucenana viehostovaistodobno.
Klasa Socket
Klasa java.net.Socket omogucujeizvodenjesvihcetirijufundamentalnihoperacijana
uticnicama. Moete ostvaritikonekcijuna udaljenoracunalo, slatii primatipodatke te
prekinutikonekciju.
Konekcijase obavljauz pomoc konstruktora. Svakomobjektu tipa Socket pridruenje
tocno jedan udaljenihost. Da biste ostvarilikonekcijuna drugihost, moratekreiratinovi
objektitipa Socket .
public Socket(String host, int port) throws UnknownHostException ,
IOException
public Socket(InetAddress address , int port) throws IOException
public Socket(String host, int port, InetAddress localAddress , int
localPort ) throws IOException
public Socket(InetAddress address , int port, InetAddress
localAddress , int localPort ) throws IOException
Port Scanner
Ne moetese naprosto konektiratina bilokoji port na bilokojem hostu. Konekcijaje
mogucasamo na one portove na kojimaudaljenoracunalooslukuje dolaznekonekcije.
Konstruktoreuticnicamoetekoristitida biste ustanovilina kojimportovimaracunalo
oslukuje. Pogledajteprimjer:
import java.net.*;
import java.io.IOException ;
public class PortScanner {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
try {
InetAddress ia = InetAddress .getByName (args[i]);
scan(ia);
}
catch (UnknownHostException e) {
System.err.println (args[i] + " is not a valid host name.");
}
}
}
public static void scan(InetAddress remote) {
// Do I need to synchronize remote?
// What happens if someone changes it while this method
// is running ?
String hostname = remote.getHostName ();
// Skanirat cemo samo portove od 78 do 81.
// Potpuno skaniranje islo bi od 0 do 65535. Ne cinite to bez
dozvole vlasnika hosta!
for (int port = 78; port < 82; port++) {
try {
Socket s = new Socket(remote, port);
System.out.println ("Server slusa na portu " + port
+ " racunala " + hostname );
s.close();
}
catch (IOException e) {
System.out.println ("Racunalo ne slusa na portu " + port);
}
}
}
public static void scan(String remote) throws
UnknownHostException {
// Why throw the UnknownHostException ? Why not catch it like I
did
// in the main() method?
InetAddress ia = InetAddress .getByName (remote);
scan(ia);
}
}
prema
maini koja nije vaa vlastita bez dozvole vlasnika / sistem inenjera, jer ce se to
smatratihakerskim napadomi ugroavanjemsigurnostiracunala!!!
Klijent Daytime
Pogledajmosada kompletanprogram, Daytime klijent, koji se konektirana daytime
posluiteljracunalastudent .math.hr na portu 13 i ispisujepodatke koje od njega
dobije.
import java.net.*;
import java.io.*;
import java.util.Date;
Klijent Discard
Pogledajmosada kompletanprogram, Discard klijent, koji se konektirana Discard
posluiteljracunalastudent .math.hr na portu 9 i alje mupodatke koje cita sa
standardnogulazaSystem.in.
import java.net.*;
import java.io.*;
catch (IOException e) {
System.err.println (e);
}
}
public Discard () throws UnknownHostException {
this (InetAddress .getLocalHost (), System.in);
}
public Discard (String name) throws UnknownHostException {
this(InetAddress .getByName (name), System.in);
}
public Discard (InetAddress server) {
this(server, System.in);
}
public Discard (InetAddress server, InputStream is) {
this.server = server;
theInput = System.in;
}
public void run() {
byte[] b = new byte[128];
try {
Socket s = new Socket(server, port);
OutputStream out = s.getOutputStream ();
while (true) {
int n = theInput .available ();
if (n > b.length) n = b.length;
int m = theInput .read(b, 0, n);
if (m == -1) break;
out.write(b, 0, m);
}
s.close();
}
catch (IOException e) {
}
}
}
% javac Discard .java
% java Discard
asdf
<Ctrl-C>
%
write
read
write
read
write
read
The echo protocol simplyechoes back anythingits sent. The followingecho clientreads
data froman inputstream, thenpasses it out to an outputstreamconnectedto a socket,
connectedto a networkecho server. A second thread reads the inputcomingback from
the server. The main() methodreads some filenamesfromthe commandlineand passes
themintothe outputstream.
import java.net.*;
import java.io.*;
import java.util.*;
}
public Echo(InetAddress server) {
this(server, System.in);
}
public Echo(InetAddress server, InputStream is) {
this.server = server;
theInput = is;
}
public void start() {
try {
Socket s = new Socket(server, port);
CopyThread toServer = new CopyThread ("toServer ",
theInput , s.getOutputStream ());
CopyThread fromServer = new CopyThread ("fromServer ",
s.getInputStream (), System.out);
toServer .start();
fromServer .start();
}
catch (IOException e) {
System.err.println (e);
}
}
}
class CopyThread extends Thread {
InputStream in;
OutputStream out;
public CopyThread (String name, InputStream in, OutputStream out)
{
super(name);
this.in = in;
this.out = out;
}
public void run() {
byte[] b = new byte[128];
try {
while (true) {
int n = in.available ();
if (n == 0) Thread.yield();
else System.err.println (n);
if (n > b.length) n = b.length;
int m = in.read(b, 0, n);
if (m == -1) {
System.out.println (getName () + " done!");
break;
}
out.write(b, 0, n);
}
}
catch (IOException e) {
}
}
}
Server Sockets
Server Sockets
Klasa ServerSocket
There are three methodsto set and get variousoptions. The defaultsare generallyfine.
public synchronized void setSoTimeout (int timeout ) throws
SocketException
public synchronized int getSoTimeout () throws IOException
public static synchronized void setSocketFactory (SocketImplFactory
fac) throws IOException
LocalPortScanner
Lokalni PortScanner
You can attemptto determinewhichports are currentlyoccupiedby tryingto create
server sockets on allof them, and seeingwhere that operationfails.
import java.net.*;
import java.io.IOException ;
try {
ServerSocket ss = new ServerSocket (80);
}
catch (IOException e) {
System.err.println (e);
}
When you create a ServerSocket object, it attemptsto bindto the port on the local
host givenby the port argument. If anotherserver socket is alreadylisteningto the port,
thena java.net.BindException , a subclassof java.io.IOException , is thrown.
No more thanone process or thread can listento a particularport at a time. Thisincludes
non-Java processes or threads. For example, ifthere's alreadyan HTTP server running
on port 80, you won't be able to bindto port 80.
On Unixsystems(but not Windowsor the Mac) your programmustbe runningas root to
bindto a port between 1 and 1023.
0 is a specialport number. It tellsJava to pick an availableport. You can thenfindout
what port it's picked withthe getLocalPort () method. Thisis usefulifthe clientand
the server have alreadyestablisheda separate channelof communicationover whichthe
chosenport numbercan be communicated.
For example, the ftp protocol uses two sockets. The initialconnectionis made by the
clientto the server to send commands. One of the commandssent tellsthe server the
nameof the port on whichthe clientis listening
. The server thenconnectsto the clienton
thisport to send data.
try {
ServerSocket ftpdata = new ServerSocket (0);
int port = ftpdata .getLocalPort ();
}
catch (IOException e) {
System.err.println (e);
}
The operatingsystemstores incomingconnectionsfor each port ina first- in, first- out
queue untiltheycan be accepted. The defaultqueue lengthvariesfromoperatingsystem
to operatingsystem. However, it tends to be between 5 and 50. Once the queue fillsup
furtherconnectionsare refuseduntilspace opens up inthe queue. If you thinkyou aren't
Choosinga localaddress
How wouldyou bindto some but not allIP addresses on the server?
WritingData to a Client
s.close();
}
catch (IOException e) {
System.err.println (e);
}
Notice inthisexample, I closed the Socket s, not the ServerSocket ss. ss is still
bound to port 2345. You get a new socket for each connectionbut it's easy to reuse the
server socket. For example, the nextcode fragmentrepeatedlyaccepts connections:
try {
ServerSocket ss = new ServerSocket (2345);
while (true) {
Socket s = ss.accept();
PrintWriter pw = new PrintWriter (s.getOutputStream ());
pw.println ("Hello There!");
pw.println ("Goodbye now.);
s.close();
}
}
catch (IOException e) {
System.err.println (e);
}
Interactingwitha Client
Interakcija s klijentom
More commonly, a server needs to both read a clientrequest and writea response. The
followingprogramreads whateverthe clientsends and thensends it back to the client. In
short thisis an echo server.
import java.net.*;
import java.io.*;
try {
ServerSocket ss = new ServerSocket (port);
while (true) {
try {
Socket s = ss.accept();
OutputStream os = s.getOutputStream ();
InputStream is = s.getInputStream ();
while (true) {
int n = is.read();
if (n == -1) break;
os.write(n);
os.flush();
}
}
catch (IOException e) {
}
}
}
catch (IOException e) {
System.err.println (e);
}
}
}
AddingThreadingto a Server
try {
OutputStream os = theConnection .getOutputStream ();
InputStream is = theConnection .getInputStream ();
while (true) {
int n = is.read();
if (n == -1) break;
os.write(n);
os.flush();
}
}
catch (IOException e) {
}
}
}
Na racunalustudent.math.hr:
% telnet pc-mladen.srce.hr 2347
Trying...
Connected to pc-mladen.srce.hr.
Escape character is '^]'.
jedan-student
jedan-student
dva-student
dva-student
^]
Connection closed by foreign host.
%
Istodobno, na racunaluregoc.srce.hr:
% telnet pc-mladen.srce.hr 2347
Trying 161.53.2.93...
Connected to pc-mladen.srce.hr.
Escape character is '^]'.
jedan-regoc
jedan-regoc
dva-regoc
dva-regoc
^]
Connection closed by foreign host.
%
try {
ServerSocket ss = new ServerSocket (port);
for (int i = 0; i < numberOfThreads ; i++) {
PoolEchoServer pes = new PoolEchoServer (ss);
pes.start();
}
}
catch (IOException e) {
System.err.println (e);
}
}
public PoolEchoServer (ServerSocket ss) {
theServer = ss;
}
public void run() {
while (true) {
try {
Socket s = theServer .accept();
OutputStream out = s.getOutputStream ();
InputStream in = s.getInputStream ();
while (true) {
int n = in.read();
if (n == -1) break;
out.write(n);
out.flush();
} // end while
} // end try
catch (IOException e) {
}
} // end while
} // end run
}
In the programabove the numberof threads is set to ten. Thiscan be adjusted for
performancereasons. How wouldyou go about testingthe performanceof thisprogram
relativeto the one that spawns a new thread for each connection? How wouldyou
determinethe optimumnumberof threads to spawn?
UDP
IntroducingUDP
to je UDP?
UDP klase
Java's support for UDP is containedintwo classes, java.net.DatagramSocket and
java.net.DatagramPacket . A DatagramSocketis used to send and receive
DatagramPackets. SinceUDP is connectionless, streamsare not used. You mustfityour
data intopackets of no more thanabout 60,000 bytes. You can manuallysplitthe data
across multiplepackets ifnecessary.
The DatagramPacket class is a wrapper for an array of bytes fromwhichdata willbe
sent or intowhichdata willbe received. It also containsthe address and port to whichthe
packet willbe sent.
The DatagramSocket class is a connectionto a port that does the sendingand receiving.
UnlikeTCP sockets, there is no distinctionbetween a UDP socket and a UDP server
socket. The same DatagramSocket can both and receive. Also unlikeTCP sockets, a
DatagramSocket can send to multiple
, differentaddresses. The address to whichdata
goes is stored inthe packet, not inthe socket.
UDP ports are separate fromTCP ports. Each computerhas 65,536 UDP ports as well
as its 65,536 TCP ports. You can have a ServerSocket bound to TCP port 20 at the
same timeas a DatagramSocket is bound to UDP port 20. Most of the timeit should
be obviousfromcontextwhetheror not I'm talkingabout TCP ports or UDP ports.
java.net.DatagramPacket
Klasa DatagramPacket
The DatagramPacket class is a wrapper for an array of bytes fromwhichdata willbe
sent or intowhichdata willbe received. It also containsthe address and port to whichthe
packet willbe sent.
public DatagramPacket (byte[] data, int length)
public DatagramPacket (byte[] data, int length, InetAddress host,
int port)
You constructa DatagramPacket object by passingan array of bytes and the number
of those bytes to send to the DatagramPacket () constructorlikethis:
String s = "My first UDP Packet"
byte[] b = s.getBytes ();
DatagramPacket dp = new DatagramPacket (b, b.length);
Normallyyou'llalso pass inthe host and port to whichyou want to send the packet:
try {
InetAddress metalab = new InetAddess ("metalab .unc.edu");
int chargen = 19;
String s = "My second UDP Packet"
byte[] b = s.getBytes ();
DatagramPacket dp = new DatagramPacket (b, b.length, ia, chargen );
}
catch (UnknownHostException e) {
System.err.println (e);
}
The byte array that's passed to the constructoris stored by reference, not by value. If you
cahngeit's contentselsewhere, the contentsof the DatagramPacket changeas well.
DatagramPacket s themselvesare not immutable
. You can changethe data,
synchronized
synchronized
synchronized
synchronized
void
void
void
void
synchronized
synchronized
synchronized
synchronized
InetAddress getAddress ()
int getPort ()
byte[] getData ()
int getLength ()
the lengthof
java.net.DatagramSocket
Klasa DatagramSocket
The java.net.DatagramSocket class has three constructors:
public DatagramSocket () throws SocketException
public DatagramSocket (int port) throws SocketException
public DatagramSocket (int port, InetAddress laddr) throws
SocketException
The firstis used for datagramsockets that are primarilyintendedto act as clients; that is
sockets that willsend datagramsbefore receivingany. The secned two that specifythe
port and optionallythe IP address of the socket, are primarilyintendedfor servers that
mustrun on a well- knownport.
The LocalPortScannerdevelopedearlieronlyfoundTCP ports. The followingprogram
detects UDP ports inuse. As withTCP ports, you mustbe root on Unixsystemsto bind
to ports below 1024.
import java.net.*;
import java.io.IOException ;
try {
DatagramSocket ds = new DatagramSocket (port);
ds.close();
}
catch (IOException e) {
System.out.println ("UDP Port " + port + " is occupied .");
}
}
}
}
SendingUDP Datagrams
Next you create a DatagramSocket object and pass the packet to its send() method:
For example,
try {
DatagramSocket sender = new DatagramSocket ();
sender.send(dp);
}
catch (IOException e) {
System.err.println (e);
}
ReceivingUDP Datagrams
unreliable, you're not guaranteedthat each lineyou type willinfact be echoed back. It
maybe lost goingbetween clientand server or returningfromserver to client.
import java.net.*;
import java.io.*;
while (true) {
try {
incoming .setLength (bufffer .length);
ds.receive (incoming );
byte[] data = incoming .getData ();
System.out.println (new String(data, 0, incoming .getLength ()
));
}
catch (IOException e) {
System.err.println (e);
}
}
}
}
u pripremi
Trinaesto predavanje - ispis i prijenos
podataka
Printing
Printing
Printing
Java 1.1 implementsprintingthroughthe java.awt.PrintGraphics interfaceand the
abstract java.awt.Printjob class.
To begina printjob you callthe staticmethod Toolkit .getPrintJob (). Thisreturnsa
platformspecificinstanceof the abstract PrintJob class. (Platformspecificdetailsare
hiddeninsidethe sun classes.)
The PrintJob object givesyou informationabout the page sizeand the printer
resolution. It also has a getGraphics () methodthat returnsa Graphics object that
implementsthe PrintGraphics interface. Oftenyou'lldraw the page by passingthis
object to your paint() method. Other timesyou'llwant to specializefor printing. For
example, you mightwant to draw inblack and whiteinsteadof color. (RegrettablyJava
does not providea methodto determinethe availablecolors on the printer.)
A page is sent to the printerwhenyou invokeits Graphics 's object's dispose ()
method. You can printmultiplepages by repeatedlycallinggetGraphics () and the
disposingeach Graphics object.
SecurityRestrictionson Printing
For example,
try {
SecurityManager sm = System.getSecurityManager ();
if (sm != null) sm.checkPrintJobAccess ();
// print...
}
catch (SecurityException e) {
System.err.println ("Sorry. Printing is not allowed .");
}
Creatinga PrintJob
Creating a PrintJob
The abstract java.awt.PrintJob class has a singlepublicnoragsconstructor,
PrintJob () . Howeverbecause it's an abstract class you can't instatiateit. Instead you
mustcallthe getPrintJob () methodinthe java.awt.Toolkit class.
public abstract PrintJob getPrintJob (Frame parent, String title,
Properties props)
A PrintJob dialog
For example:
PrintJob pj =
Toolkit .getDefaultToolkit ().getPrintJob (new Frame(),
"Hello World", null);
Methods of java.awt.PrintJob
The drawingitselfis done witha java.awt.Graphics object likethe one you use inthe
paint() methodof an applet. Thisis returnedby getGraphics () , and has allthe usual
methodof the Graphics class, drawLine (), drawString (), and so on.
public abstract Graphics getGraphics ()
When you're done witha PrintJob callits end() methodto performany necessary
flushingand cleanup.
public abstract void end()
PrintingGraphics: an example
PrintingText
Printing Text
The trick to printingtext is to measureit and compare it to the page sizeand resolutionin
a givenfont. You do thiswiththe java.awt.FontMetrics class.
// This example is from the book _Java AWT Reference _ by John
Zukowski .
// Written by John Zukowski . Copyright (c) 1997 O'Reilly &
Associates .
// You may study, use, modify, and distribute this example for any
purpose .
// This example is provided WITHOUT WARRANTY either expressed or
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Properties ;
public class TestPrint extends Frame {
TextArea textArea ;
Label statusInfo ;
Button loadButton , printButton , closeButton ;
Properties p = new Properties ();
public TestPrint () {
super ("File Loader");
add (statusInfo = new Label(), "North");
Panel p = new Panel ();
p.add (loadButton = new Button ("Load"));
loadButton .addActionListener ( new LoadFileCommand () );
p.add (printButton = new Button ("Print"));
printButton .addActionListener ( new PrintCommand () );
p.add (closeButton = new Button ("Close"));
closeButton .addActionListener ( new CloseCommand () );
if (pg != null) {
String s = textArea .getText ();
printLongString (pjob, pg, s);
pg.dispose ();
}
pjob.end();
}
}
}
// Print string to graphics via printjob
// Does not deal with word wrap or tabs
void printLongString (PrintJob pjob, Graphics pg, String s) {
int pageNum = 1;
int linesForThisPage = 0;
int linesForThisJob = 0;
// Note: String is immutable so won't change while printing .
if (!(pg instanceof PrintGraphics )) {
throw new IllegalArgumentException ("Graphics context not
PrintGraphics ");
}
StringReader sr = new StringReader (s);
LineNumberReader lnr = new LineNumberReader (sr);
String nextLine ;
int pageHeight = pjob.getPageDimension ().height;
Font helv = new Font("Helvetica ", Font.PLAIN, 12);
//have to set the font to get any output
pg.setFont (helv);
FontMetrics fm = pg.getFontMetrics (helv);
int fontHeight = fm.getHeight ();
int fontDescent = fm.getDescent ();
int curHeight = 0;
try {
do {
nextLine = lnr.readLine ();
if (nextLine != null) {
if ((curHeight + fontHeight ) > pageHeight ) {
// New Page
System.out.println ("" + linesForThisPage + " lines
printed for page " + pageNum );
pageNum ++;
linesForThisPage = 0;
pg.dispose ();
pg = pjob.getGraphics ();
if (pg != null) {
pg.setFont (helv);
}
curHeight = 0;
}
curHeight += fontHeight ;
if (pg != null) {
pg.drawString (nextLine , 0, curHeight - fontDescent );
linesForThisPage ++;
linesForThisJob ++;
} else {
System.out.println ("pg null");
}
}
PrintingComponents
Printing Components
You don't draw most buttons, lists, scrollbars, panels, and so on inyour paint()
method. You don't have to printthemthere either. The java.awt.Component class has
print() and printAll () methods
public void print(Graphics g)
public void printAll (Graphics g)
java.awt.Container
inthe container:
public void printComponents (Graphics g)
PrintingComponents: an example
Printing Components
The followingsimpleprogramprintsitselfwhenyou press the printbutton:
import java.awt.*;
public class PrintableFrame extends Frame
implements ActionListener {
Button printButton ;
public static void main(String[] args) {
PrintableFrame pf = new PrintableFrame ("Printable Frame");
Label quote = new Label(
"Now is the time for all good men to come to the aid of their
country .");
pf.add("North", quote);
}
public PrintableFrame (String s) {
super(s);
setSize (350, 200);
setLocation (100, 100);
printButton = new Button("Print Me!");
printButton .addActionListener (this);
Panel p = new Panel();
p.add(printButton );
add("South", p);
}
public void actionPerformed (ActionEvent e) {
PrintJob pj = getToolkit ().getPrintJob (this, getTitle (), null);
if (pj != null) {
Graphics pg = pj.getGraphics ();
printComponents (pg);
pg.dispose ();
pj.end();
}
}
}
The Clipboard
The Clipboard
Modern, multitaskingoperatingsystemsand graphicaluser interfacesallowyou to
transferdata between programsat the request of the user througha systemfacilitycalled
a clipboard. In general, clipboardscan containtext, pictures, sound, formattedtext, data
inparticularformatsand more. However, not allprogramsknow how to interpretalldata
formats.
Most of the timethe user somehowselectsthe data to be placed on the clipboard. The
data maythenbe copied to the clipboard, generallyby selecting"Copy" fromthe Edit
menuor by usingthe C shortcutkey. Alternatelydata can be cut out of the running
programand placed on the clipboard. Copied data remainsinthe originaldocumentwhile
cut data is deleted fromthe originaldocument. The data is thenplaced back intothe same
documentor intoa differentdocumnentby pastingit fromthe clipboard. On most
operatingsystems(thoughOpenWindowsis a notableexception) pastingdoes not
removethe data fromthe clipboard.
As wellas the systemclipboardmanyapplicationshave privateclipboardsthat are used
for intra-applicationdata transfer. The systemclipboardis used for inter-applicationdata
transfer.
The java.awt.datatransferPackage
The TextArea class (but not the TextField class) also has insert() and
replaceRange () methodsyou can use for pasting:
public synchronized void insert(String s, int pos)
public synchronized void replaceRange (String s, int start, int
end)
What's the differencebetween these two methods? When wouldyou use insert() and
whenwouldyou use replaceRange ()?
Implementing Pasting
1. Get the systemclipboardusingthe getSystemClipboard () methodof the
java.awt.Toolkit class.
2. Get the clipboard's contentsusingusingthe getContents () methodof the
Clipboardclass.
3. Get the data ina particularflavorusinggetTransferData ().
4. Cast the object returnedto the approriatetype.
For example,
public void paste(TextField tf)
java.io.*;
java.awt.*;
java.awt.datatransfer .*;
java.awt.event.*;
Menu makeEditMenu () {
Menu editMenu = new Menu("Edit");
MenuItem mi = new MenuItem ("Cut");
mi.addActionListener (this);
editMenu .add(mi);
mi = new MenuItem ("Copy");
mi.addActionListener (this);
editMenu .add(mi);
mi = new MenuItem ("Paste");
mi.addActionListener (this);
editMenu .add(mi);
mi = new MenuItem ("Clear");
mi.addActionListener (this);
editMenu .add(mi);
return editMenu ;
}
Data Flavors
Data Flavors
Differentapplicationsunderstanddata differently
, even the same kindof data. For
examplemost word processors support some formof formattedtext withdifferentfonts,
styles, sizesand so on. HoweverMicrosoftWord 6.0 for the Mac is not able to read
formattedtext produced by ClarisWorksand viceversa. PicturesfromPhotoshopcan be
copied and pasted intomanyprograms, but the layerstend to get flattenedwhenyou do
that.
The clipboardonlyreallyunderstandsraw bytes. It does not inherentlyknow how
whetherthose bytes are text or a pictureor a table or somethingelse. The
java.awt.datatransfer .DataFlavor class uses MIME types and subtypesto
identifythe kindof data stored inthe clipboard.
MIME, the MultipurposeInternetMailExtensions, is an Internetstandard definedin
RFCs 2045 through2049 for transferringmultimedia
, binarydata through7-bit ASCII
email. RFC 2046 inparticularspecifiesthe MIME type systemand definesthe base set
of mediatypes. New MIME types are registoeredwithand approved by the Internet
AssignedNumbersAuthority(IANA). The currentlistof standardizedtypes is available
fromftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types.
A MIME type has a type and a subtype. For example, text/plain, application/x-javaserialized-object, or image/gif. There are fivedefinedtypes: text, image, audio, video,
multipart, message, model, and application. The firstsevenare self-explanatory. The last
is used for arbitrarybinarydata. Subtypesthat beginwithan x such as "x-java-serialized-
The java.awt.datatransfer.DataFlavorclass
The java.awt.datatransfer.Clipboardclass
There are also three methodsthat allowyou to get the nameof the object currentlyon the
clipboard(onlyone object can be on a clipboardat a time), to get the contentsof the
clipboard(paste), or to set the contentsof the clipboard(cut or copy):
public String getName ()
public synchronized void setContents (Transferable contents ,
ClipboardOwner owner)
public synchronized Transferable getContents (Object requestor )
The java.awt.datatransfer.ClipboardOwnerinterface
The java.awt.datatransfer.Transferableinterface
The java.awt.datatransfer.StringSelectionclass
Continuing Onward
FutureDirections
Object OrientedAnalysisand Design
Java 2D API
Java 3D API
The VirtualMachineand Byte Code
Java's SecurityModel
Code signingand encryptionwiththe java.securitypackage
NativeMethods
JDBC
RemoteMethod Invocation(RMI)
Java Web Server
JavaBeans
The Java Media API
Java TelephonyServicesAPI
JavaOS
Java ElectronicCommerceFramework
JavaSpaces
Protocol and ContentHandlers
The Java Namingand DirectoryInterface(JNDI)
CORBA and IDL
JavaScript