OSTRAVSKÁ UNIVERZITA P Ř Í R O D O V Ě D N Á F A K U L T A
X J A V 1 – O O P P R O I N T E R N E T A I N T R A N E T
I N G . D A V I D B R A Ž I N A
OSTRAVA 2002
1
Cíle předmětu
Po prostudování textu budete znát: • základní tř ídy používané jazykem JAVA. Seznámíte se ze základními
prostředky pro tvorbu apl ikací a appletů . Poznáte s t rukturu programovacího jazyka JAVA a seznámíte se z jeho syntaxí .
Získáte: • dovednost i ve tvorbě dynamických internetových s tránek. Získáte prakt ické
zkušenost i s tvorbou interakt ivních appletů , budete umě t spoj i t vlastnost i apl ikace a appletu v rámci s loži tě jš ích programových s truktur .
Budete schopni: • Zpracovávat událost i myši a klávesnice a zároveň s těmito událostmi pracovat .
Budete schopni vytvo ř i t interakt ivní apl ikace v rámci webovských s tránek. Nauč í te se pracovat s edi torem JCreator od Xinox Software.
Čas potřebný k prostudování uč iva předmětu:13-14. týdnů
2
Obsah
1. ÚVOD............................................................................................................................. 5
2. HISTORIE JAVY ......................................................................................................... 6 2.1. VÝHODY A NEVÝHODY JAVY ................................................................................... 7
2.1.1. Vlastnosti Javy ................................................................................................ 9 2.2. APLIKACE A APPLETY ............................................................................................ 11
3. JAVASCRIPT ............................................................................................................. 14
4. VÝVOJOVÉ PROSTŘEDÍ JAVY - APLIKACE.................................................... 16 4.1. PLATFORMA JAVY.................................................................................................. 19
5. OBJEKTOVÉ PROGRAMOVÁNÍ JAVY............................................................... 20 5.1. PSANÍ PROGRAMU .................................................................................................. 21 5.2. ZÁKLADNÍ SCHÉMA PROGRAMU............................................................................. 24 5.3. PRÁCE S OBJEKTY .................................................................................................. 25
5.3.1. Odkazování objektů....................................................................................... 26 5.4. TŘÍDY A DĚDIČNOST........................................................................................... 27
5.4.1. Atributy a metody třídy ................................................................................. 29 5.4.2. Import třídy ................................................................................................... 30 5.4.3. Kontrola přístupu.............................................................................................. 31
5.5. METODY ................................................................................................................ 32 5.6. BALÍKY .................................................................................................................. 33
5.6.1. Tvorba a použití balíčků ............................................................................... 34 5.6.2. Výjimky.......................................................................................................... 35
5.7. VÝRAZY ŘÍZENÍ BĚHU PROGRAMU ......................................................................... 36 5.7.1. Komentář....................................................................................................... 37 5.7.2. Identifikátory................................................................................................. 37 5.7.3. Literály.......................................................................................................... 37 5.7.4. Pole ............................................................................................................... 38 5.7.5. Operátory...................................................................................................... 38 5.7.6. Větveni programu.......................................................................................... 39 5.7.7. Smyčky........................................................................................................... 40
5.8. VSTUP A VÝSTUP.................................................................................................... 41 5.8.1. Práce se soubory........................................................................................... 44
5.9. ZPRACOVÁNI VSTUPU A VÝSTUPU MYŠI ................................................................. 48 5.10. SÍŤOVÉ PROGRAMOVÁNÍ V PROSTŘEDÍ TCP/IP ...................................................... 50
6. TEST Č.1 ..................................................................................................................... 52
7. VÝVOJOVÉ PROSTŘEDÍ JAVY - APPLETY ...................................................... 56 7.1. PRÁCE S TEXTEM A GRAFIKOU ............................................................................... 57
7.1.1. Vložení textu.................................................................................................. 58 7.1.2. Typy písma .................................................................................................... 59 7.1.3. Barva písma .................................................................................................. 60
7.2. VYKRESLOVÁNÍ GEOMETRICKÝCH TVARŮ ............................................................. 61 7.2.1. Kreslení čar................................................................................................... 61 7.2.2. Kreslení obdélníků ........................................................................................ 61
3
7.2.3. Kreslení kružnic a oblouků ........................................................................... 63 7.3. UDÁLOSTI MYŠI A KLÁVESNICE.............................................................................. 64
7.3.1. Události myši ................................................................................................ 64 7.3.2. Události klávesnice ....................................................................................... 71
7.4. PANELY.................................................................................................................. 74 7.5. ZPRACOVÁNI GRAFICKÉ UDÁLOSTI ........................................................................ 75
7.5.1. Další typy grafických objektů........................................................................ 76 7.6. POKROČILÉ PRVKY GRAFICKÉHO ROZHRÁNI .......................................................... 78
7.6.1. Grafické objekty a animace .......................................................................... 79 7.7. TŘÍDA MEDIATRACKER ......................................................................................... 82 7.8. ZVUKOVÉ PŘEHRÁVKY........................................................................................... 84
8. TEST Č.2 ..................................................................................................................... 86
9. SEZNAM POUŽITÉ A DOPORUČENÉ LITERATURY ..................................... 88
4
1. Úvod
V této kapitole se dozvíte: jak bude členěn kurz XJAV1, podmínky úspěšného absolvování předmětu Doba potřebná k prostudování této kapitoly: 5 minut
Předmět OOP pro Internet a Intranet si klade za cíl seznámit účastníky kurzu
s možnostmi programovacího jazyku JAVA při tvorbě klientských aplikací a appletů. V první polovině semestru se seznámíte s tvorbou aplikací, se síťovými prostředky
Javy, se základním programovým vybavením, a s možnostmi vytváření samostatných programů a jejich výrazovými prostředky.
V druhé polovině semestru se soustředíme na tvorbu appletů, jako prostředků pro
oživení internetových stránek. Dále se seznámíte s množstvím prostředků, které pracují s multimédii jako je zvuk, obrazy a animace.
Pro studium tohoto předmětu je nutná alespoň částečná znalost tvorby internetových
stránek a jazyka HTML. Výhodou je znalost programování v libovolném objektově orientovaném programovacím jazyku.
Podmínkou úspěšného absolvování předmětu je vypracování úkolů označených
symbolem obálky a vypracování odpovědí na testy jedna a dvě. Veškeré dotazy a odpovědí na korespondenční úlohy a testy zasílejte na adresu
5
2. Historie Javy
V této kapitole se dozvíte o: Vzniku Javy, dynamických WWW, integraci Javy do prohlížeče. Doba potřebná k prostudování této kapitoly: 15 minut
Programovací jazyk Java vznikal kolem roku 1990. Členové vývojového týmu
Green společnosti Sun Microsystems, si uvědomili, že v budoucnosti bude většina spotřební
elektroniky obsahovat počítačové mikroprocesory. Java pak byla výsledkem výzkumu
v oblasti komunikace mezi těmito spotřebními zařízeními.
Prvním spotřebním zařízením, které využívalo novou technologii byl dálkový
ovladač pro televizor a videorekordér. Pomocí animované postavičky přecházel uživatel
s jednoho grafického menu do druhého. Tak spatřila světlo světa první aplikace Javy.
V roce 1993 nastupuje World Wide Web a získává si velkou popularitu. Každý kdo
měl přístup k sítí, se mohl k němu připojit, a nezáleželo na tom jaký po užíval operační
systém.
World Wide Web (dále jen WWW) umožňoval přístup k statickým textům nebo
obrázkům. S rostoucím nárůstem uživatelů internetu se stupňovali požadavky na dynamické
prostředí webovských stránek.
Prvním prohlížečem, který umožňoval spouštění dynamických stránek byl
WebRuner, (později značen jako HotJava).
V roce 1995 byl prostřednictvím sítě internet, zveřejněn zdrojový kód Javy. V témže
roce společnost Netscape integrovala Javu do svého prohlížeče.
6
2.1. Výhody a nevýhody Javy
n
v
v
u
k
d
n
t
v
n
z
s
V této kapitole se dozvíte o: Internetu a programování, přenositelnosti a virtuálním stroji. O vlastnostech Javy a kompilaci programu, Doba potřebná k prostudování této kapitoly: 30 minut
Může se zdát, že není třeba vyvíjet programovací jazyk pro internet. Vždyť stačí
apsat program v jakémkoliv programovacím jazyce a uložit jako spustitelný soubor
rámci HTML. Pokud by šlo pouze o sepsání a spuštění programu zdá se tento nápad
ynikající. Problémy ale nastanou v případě, pokud se má takto upravená stránka opravdu
místit na web a spouštět se z něj.
Každý takový program bude vyžadovat podporu knihoven, které budou
omunikovat s www stránkami. Tyto knihovny se budou navzájem lišit a tak bude třeba
alší množství knihoven, které program budou doprovázet.
Snad ale nejklíčovějším problémem, který by nastal, je délka programu a doba trvání
ačítání do paměti příjemcova počítače. I natažení velmi malého objemu dat po sítí, může
rvat dlouhou dobu. Poruchy na cestě způsobí, že některé data se budou muset poslat
ícekrát. Výhodou Javy v tomto směru je, že programy, které v Javě vznikají jsou
epoměrně menší než srovnatelné programy psány v jiném programovacím jazyce.
V neposlední řadě by bylo nutné do programu zahrnout spoustu knihoven tak, aby se
aručila potřebná bezpečnost kódu a spouštěcího prostředí.
Velkou zátěží by se stal každý operační systém lišící se architekturou od operačního
ystému autora programu.
7
To všechno vedlo k tomu aby se z Javy stal programovací jazyk pro svět internetu.
Java je objektově orientovaný, na platformě nezávislý, programovací jazyk. Aplikace psaná
pro Linux, či Windows je bez větších problémů přenositelná na palm-top či mobilní telefon.
Nezávislost Javy je dána tzv. virtuálním strojem, který zajišťuje spustitelnost
zdrojového kódu. Lze ji využít k programování plnohodnotných aplikací na jedné straně a
appletů na straně druhé.
Java není vhodným programovacím jazykem pro systémové programování (operační
systémy, ovládače), tuto nevýhodu kompenzuje podpora internetových technologií, díky
nimž se Java stala univerzálním programovacím jazykem informačních sítí.
8
2.1.1. Vlastnosti Javy
Syntaxe jazyka je odvozena od jazyků C a C++. Mnoho programových návyků
osvojených v C++ se vám při začátcích s Javou bude hodit. Na rozdíl od C++ není třeba
v Javě dealokovat nepotřebné objekty . Java je odstraní automaticky.
V Javě jsou odstraněny i pointery (ukazatele), preprocesor (makra, direktivy), a další
programové prostředky užívané v C++.
To vede k tomu, že kód je mnohem jednodušší a přehlednější. I když slovo
přehlednější je nutno brát občas s velkou rezervou.
Obr.1
9
Nejdůležitějšími vlastnostmi Javy jsou:
Na platformě nezávislý jazyk. Program který je napsán v javě lze
spustit na libovolném počítači nezávisle na operačním systému. Program
psaný pro javu lze bez větších komplikací přenést na mobilní zařízení
jako jsou mobilní telefony, palm-topy a podobně.
Objektově orientovaný jazyk. Stejně jako C++, Delphi a podobně se i
Java řadí do rodiny objektově orientovaných jazyků. Platí pro ní
stejné pravidla. Výhodou je zde zejména větší přehlednost a
jednoduchost.
Technologie Internetu. Rozmach Javy je víceméně odrazem rozmachu
Internetu. Internetový přenos se uskutečňuje prostřednictvím TCP/IP
protolu a Java jako univerzální programovací jazyk jej podporuje spolu
s řadou dalších internetových technologií jako jsou grafické, zvukové
i filmové formáty. Jazykovým kódem Unicode podporuje i řadu
neanglických jazyků.
Multithreading. Možnost provádění několika částí programů v jednom
okamžiku.
Bezpečnost. Součástí programových prostředků je třída SecurityManager,
která hlídá všechny akce, které mohou mít vliv na stav lokálních
souborů. Zároveň se stará o bezpečný přístup k síti.
10
2.2. Aplikace a applety
V této kapitole se dozvíte o: Základních typech programů vyvíjených Javou. Naučíte se vytvořit applet z aplikace. Dovíte se o omezeních kladených na applety. Doba potřebná k prostudování této kapitoly: 30 minut
V Javě programujeme dva základní typy programů. Jsou to applety a aplikace. Může
se to zdát možná složité, tak si to zjednodušíme. Applety jsou malé aplikace, které
spouštíme prostřednictvím internetových stránek. Slouží jako prográmky, které naše stránky
mají oživit, dát do nich nějaký prvek originality a hlavně dynamiky.
Aplikaci myslíme samostatný program, který vyžaduje Java Platformu pro své fungování.
Na aplikaci nejsou kladená bezpečnostní omezení. To znamená, že aplikace může pracovat
se soubory (zapisovat do nich).
Applet je naproti tomu program určený pro umístění na webovský server. Je včleněn do
HTML kódu tvořícího www stránku. Po vstupu klienta se automaticky nahraje na jeho
počítač a je spuštěn. Protože představa, že kliknutím na něčí stránku si naformátujete disk
se nikomu nelíbila, nesmí applet vykonávat určité operace:
Applet Javy nesmí:
Číst a zapisovat do lokálních souborů.
Manipulovat s lokálními soubory.
Spouštět programy na klientském počítači.
Tisknout.
Přepisovat systémové proměnné.
Číst některé systémové proměnné.
Číst data ze schránky (clipboardu).
Ukončit práci virtuálního stroje.
Navazovat síťová spojení (s výjimkou svého domovského serveru).
11
Před spuštěním appletu je třeba na něj umístit odkaz do HTML tvořícího WWW stránku.
To se děje pomocí formátovací značky <APPLET>, která má následující strukturu <APPLET CODE = “trida.class” WIDTH= “sirka” HEIGHT=”vyska” [ NAME=”jmenoInstanceAppletu”] [CODEBASE=”url”] [ARCHIVE=”Jarsoubor1,2..n”] [ALT=”alternativni text”] [ALIGN=“zarovnani“] [HSPACE nebo VSPACE=“vodorovne nebo svisle Odsazeni“] </APPLET>
Applety na téže WWW stránce spolu mohou komunikovat pomocí volání svých
veřejných metod. Applet, kterého chceme volat musí být pojmenován (name) ve značce
<APPLET>. Podívejme se na příklad aplikace a appletu:
Aplikace import java.io.*; public class VypisAdresare { Public static void main(String[] argv) { String jmenoAktDir = System.get.property("user.dir") File aktDir = new File(jmeno AktDir); String[] jmena; jmena = aktDir.list(); for (int i=0; i<jmena.length; i++) System.out.println(jmena[i]); File[] soubory soubory = aktDir.listFiles(); for (int i=0; i<soubory.length; i++) System.out.println(soubory[i].getName()+"t\") +soubory[i].length()); } }
Příklad 1.
Tento program je poměrně složitý takže jej přelétněte jen opravdu velmi zběžně.
Důležité je si všimnout tučně označeného řádku. Ten volá knihovnu java.io.
Následující znak .* volá všechny funkce třídy java.io Podrobněji si to osvítíme
v příkladech věnovaných tvorbě appletů.
12
Pokud vezmeme tuto aplikaci a budeme chtít z ní udělat applet, provedeme to
jednoduše.
Applet <html> <head> <title>Applet</title> <body> Funguje mi tento applet?<p> <applet code=”VypisAdresare.class” width=”200” height=”200”> </applet> </body> </html>
Příklad 2
Co myslíte, bude daný applet fungovat? Když ne tak proč, a když ano tak kdy? ☺
13
3. JavaScript
V této kapitole se dozvíte o: o tvorbě javascriptů. Dozvíte se jak je javascript uvozován na HTML stránce. Dovíte se jaký je rozdíl mezi javascriptem a Javou. Doba potřebná k prostudování této kapitoly: 30 minut
JavaScript je kompaktní objektově orientovaný programovací jazyk primárně určen
pro internetové aplikace, které pracují na bázi aplikací klient-server.
I přes podobnost obou názvů a vlastní syntaxe nelze říct, že jazyky Java a JavaScript
jsou totožné. JavaScript je vyvíjen firmou Netscape, která jej prezentuje jako prostředníka
mezi internetovou stránkou umístěnou na serveru a klientem, který se na server přihlásil.
Internetovou stránku psanou v JavaScriptu odlišíme od stránky psané v Javě snadno. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>javascript</title> </head> <body> <script language="JavaScript"> <!-- document.write("Tak co tady asi napsat?"); //--> </script> </body> </html>
Přiklad 3
14
Podívejme se na tučné řádky. Tyto informuji prohlížeč o tom jakým způsobem má
být daná stránka zpracována. Výsledkem taková stránky pak je:
Obr.2
Dvojklikem na obrázek zobrazíte originální stránku
15
4. Vývojové prostředí Javy - Aplikace
V této kapitole se dozvíte o: zdrojích, kde najdete programové vybavení pro programování v Javě. Dozvíte se o kompilaci programu a naučíte se využívat programů obsažených ve vlastním vývojovém prostředí Javy Doba potřebná k prostudování této kapitoly: 15 minut
Hned v úvodu je třeba říct, že k tomu aby jste mohli úspěšně programovat v Javě,
musíte sehnat nějaké to programové vybavení. To najdete na domovských stránkách Sun
Microsystems. A to na:
http://java.sun.com/j2se/1.4/download.html
http://www.javasoft.com/products/jdk/
Stáhněte si soubor, který má velikost okolo 35Mb a nainstalujte. Po nainstalování
najdete několik nových souborů v adresáři c:\java\bin.
Než se na ně podíváme blíže řekneme si jakým způsobem vlastně program
vytvoříme.
Vytvoření zdrojového kódu
(soubor.java)
Přeložení kódu programem javac.exe
(soubor.class)
Spuštění souboru .class interpretem
java.exe
Appletviewer
.exe
Vytvoření appletů
Obr.3
16
Podle obrázku je vidět jakým způsobem postupujeme při vlastním chodu programu.
Poté co jej napíšeme, např. v textovém editoru notepad, a uložíme s příponou .java tento
soubor přeložíme programem javac.exe a dostaneme soubor s příponou .class.
Tento soubor pak spustíme programem java.exe, nebo jej vnoříme do html kódu
jako applet, nebo se na něj podíváme pomocí programu appletviewer.exe. Že je to složité?
Tak si to ukážeme:
1. V notepadu napíšu zdrojový kód programu, a hotový zdrojový kód
uložím jako MujProgram1.java
2. Z adresáře c:\java\bin spustím program javac.exe:
c:\java\bin\javac.exe c:\programy\MujProgram1.java
3. Výsledným souborem bude c:\programy\MujProgram1.class
4. Programem c:\java\bin\java.exe spustím soubor MujProgram1.class.
Obr.4
class MujProgram1 { public static void main (String args[]) { System.out.println ("Dobry Den!"); } }
Příklad 4
Všimněte si, že název programu a jméno třídy se shodují včetně velkých a malých
písmen.
Podívejme se co vlastně tento program dělá. První příkaz vytvoří počáteční třídu. Se
shodným názvem celé třídy. Další příkaz definuje funkci programu. Informuje nás o tom o
co vlastně půjde.
17
Činnost programu (aplikace), začíná vždy funkcí main. Její definici jste viděli. Složené
závorky uzavírají vlastní tělo programu. Systém je objekt, out je standardní výstupní
zařízení.
MujProgram1.class si můžu prohlédnout i v appletvieweru, nebo jako applet ho
integrovat na webovskou stránku a prohlédnout si jej přímo v prohlížeči.
Vedle programů javac.exe, java.exe a appletviewer.exe existují další
programy, které usnadňují práci při diagnostikování problémů a chyb.
Jedním z nich je javadoc.exe, který vytváří dokumentaci k souboru
MujProgram1.java v HTML formátu.
Program javap.exe se nazývá disassambler javy a převádí soubory třídy javy
(MujProgram1.class) do zdrojového kódu.
18
4.1. Platforma Javy
s
p
(
h
č
p
p
j
t
n
V této kapitole se dozvíte o: JAVA virtual machin, JAVA Core o a bytecodu Doba potřebná k prostudování této kapitoly: 15 minut
Jak již bylo řečeno, Java je na platformě nezávislý programovací jazyk. Podívejme
e tedy na to jak toho dosahuje. Zdrojový kód programovacích jazyků (Pascal, C, C++) se
ři překladu přepisuje na strojový kód konkrétního procesoru.
V Javě se zdrojový kód místo do strojového přepisuje do tzv. bytového kódu
bytecode). Kompatibilita takového kódu je pak zajištěna na binární úrovni. Rozdíly mezi
ardwarovým vybavením pak vyrovnává vlastní Java Platforma, která se skládá ze dvou
ásti: Abstraktní počítač – je to virtuální zařízení (Java Virtual Machine
- JVM), které obsahuje interpret (vykonává vlastní kód) a runtime
systém (hardwarový optimalizátor)
Aplikační programové rozhraní (Java Core API) - jsou to základní
knihovny pro psaní programů.
Když požádáte kompilátor Javy o kompilaci programu, ten nevygeneruje normální
rogram. Místo generování spustitelného souboru s instrukcemi pro procesor 80x86
řekladač Javy vyrobí to čemu se říká Java bytecode.
Pokud tento program chcete spustit potřebujete k tomu Javovský virtuální stroj na
akémkoliv počítači a operačním systému, který zrovna potřebujete.
Interpretace bytecode v prohlížeči snižuje výkon programu. Tento problém řeší
akzvaná just-in-kompilace. Pokud je tato metoda povolena, zkonvertuje se bajtový kód
a vnitřní kód počítače (strojový kód). Tento se uloží na disk a následně spustí.
19
5. Objektové programování Javy
V této kapitole se dozvíte o: základní kostře programu, o tom co je objekt a zmíníme se o třídách Doba potřebná k prostudování této kapitoly: 15 minut
Nejjednodušším způsobem jak se naučit nový programovací jazyk, je…. programování!!!
No vida, když jsme objevili toto zlaté pravidlo můžeme se střemhlav vrhnout do víru
programátorských vášní a slastných opojení z toho, že to funguje. Každý program musí
obsahovat alespoň jednu třídu, class.
Class MujProgram1 { vlastní část }
Všimněte si, že název třídy je shodný s názvem výsledného souboru
.class včetně malých a velkých písmen, a že nekončí středníkem. Třídy v průběhu
programu vytvářejí jakési berličky, objekty, které využijí a odstraní.
Objekt spojuje programový kód a data do jedné samostatné jednotky. Třídy jsou
příkazy programu, které definují data a kód v objektu. Musíme si uvědomit, že třída je to
s čím se v Javě budeme setkávat na každém kroku. Jakmile vytvoříme jednu třídu pak
uvnitř ní můžeme vytvořit tolik objektů kolik potřebujeme. Díky tomu pak stačí takovou
třídu připojit do nového programu a nemusíme všechny metody definovat znovu a znovu.
Jak jsme si už ukázali, výsledné programy Javy dělíme podle umístění na aplikace a
applety. Appletem rozumíme program integrovaný do webovské stránky. Každý jiný
program je pak aplikací. Jak aplikace tak i applety jsou třídy, které vycházejí ze třídy
Object. O třídách si ještě povíme později.
20
5.1. Psaní programu
V této kapitole se dozvíte o: funkci a možnostech editoru JCreator firmy Xinox Software. Úlohou této kapitoly je aby jste se pokusili s tímto produktem seznámit a pochopili jeho ovládání. Doba potřebná k prostudování této kapitoly: 45 minut
Při psaní jakéhokoli programu potřebujeme nezbytně pár věcí. Předně si musíme
ujasnit v jakém prostředí vlastně chceme pracovat a jaký styl práce nám vyhovuje.
Pro účely tohoto kurzu nám poslouží program od firmy Xinox Software, který se
jmenuje JCreator. Je volně dostupný jak na internetu a vy jej můžete najít zde.
Obr.5
21
Obr.6 Vidíte, že máte na výběr ze tří základních možností: aplikace, appletu a prázdného
projektu. Kliknutím na políčko aplikace se vám otevře toto okno. V levé oblasti nahoře
máte seznam rozdělaných projektů.
Obr.7
22
Ve spodní části jsou pak funkce používané programem, což se vám bude hodit při
kontrole složitějších programů. Ovládání tohoto editoru je intuitivní a nechám na vás jak se
s ním seznámíte.
23
5.2. Základní schéma programu
V této kapitole se dozvíte o: definicích tříd v Javě, o balíčcích a algoritmu programování v Javě. Doba potřebná k prostudování této kapitoly: 15 minut
Program v Javě obsahuje jednu nebo více definici třídy. Pouze jedna třída může být
deklarována jako public. Tato třída musí nést stejné jméno jako zdrojový soubor (.java)
Každá třída je kompilována do samostatného souboru (.class)
Binární tvar třídy musí být uložen buď v aktuálním adresáři aplikace, nebo
v adresáři shodujícím se jménem balíku (package). Podívejme se jak vypadá takové
jednoduché schéma programu.
import java.lang.*; import java.io.*;
class jmeno.tridy
public static void main (String args[])
System.out.println(“ahoj”);
O
2
Jako první si definujeme třídy jejichž metody budeme chtít používat. Třída java.lang.* se vynechává protože bývá automaticky včleňována
Definice a implementace třídy. Název třídy musí shodný s názvem souboru.
Určení metody, která je součásti importované třídy.
Vlastní tělo programu vykonávající nějakou “práci”
br.8
4
5.3. Práce s objekty
N
s
S
r
ř
J
R
K
p
o
o
V této kapitole se dozvíte o: objektech a o jejich vzniku a zániku.seznámíte se s konstruktory a s metodou jejich odstraňování, povíme si i o odkazování Doba potřebná k prostudování této kapitoly: 30 minut
Objekt je inicializován klíčovým operátorem new. Pokud napíšu
ew = String (“slovo”) vytvoří se objekt třídy String a inicializuje ho konstruktorem
parametrem "slovo". A k čemu to je dobré?
tring retezec = new String("ahoj"); // vytvoření objektu
etezec = retezec.concat("!"); // volání metody
Příklad 5
Metoda concat() vrací nový řetězec, který vznikne připojením parametru na konec
etězce. Výsledek se přiřadí do proměnné retezec. Všimněte si spojení retezec.concat
ak bude vypadat výsledný řetězec?
Pokud budu chtít tento objekt zrušit musím tomuto objektu přiradit proměnnou null
etezec=null;
dy se objekt odstraní automaticky?
Java neumožňuje přímou prácí s pamětí. Voláním new vyvolám nový objekt, který
oužívám tak dlouho dokud jej potřebuji. O uvolnění paměti se stará proces, který je
značován jako garbage colection. V případě že zaniknout všechny odkazy na daný
bjekt, program to po čase zjistí sám, a objekt zruší.
25
V jiných objektově orientovaných jazycích, jsou k dispozici metody, tzv.
destruktory, které volají odstranění objektu z paměti. V Javě destruktory neužíváme, a
tak nevíme kdy přesně bude náš objekt z paměti odstraněn. Pokud však chceme provést
určitou akci ještě před zrušením objektu, můžeme předdefinovat metodu Void
finalize(). Program tuto metodu zavolá těsně před odstraněním z paměti.
5.3.1. Odkazování objektů.
Víme z jazyka C co jsou to ukazatelé. V Javě ukazatelé nejsou, ale i tady si velmi
rychle pomůžeme díky tzv. odkazování. Odkaz si můžeme představit jako jméno. Jsem
člověk(doufám…). Jsem objekt. Jmenuji se David. David je odkaz na člověka(nebudeme o
tom polemizovat ☺) Něco se stane a já dostanu přezdívku. Všichni budou vědět, že jsem to
já, i když někteří mě budou znát jen podle přezdívky. Přezdívka působí jako odkaz. Brazina David = new Brazina; Brazina prezdivka = David; Brazina 2.prezdivka = David | 2.prezdivka = new Brazina
Příklad 6
Teď mě nikdo nezná jako Bražinu, ale jen pod přezdívkou, ačkoliv jsem to pořád já
(Bražina). Čili odkazuji se vlastně na jiný objekt, ale ze stejnými vlastnostmi.
26
5.4. Třídy a dědičnost
m
t
p
v
V této kapitole se dozvíte o: dědičnostech tříd o jejich atributech a metodách. Dovíte se co musí splňovatkaždá korektní třída i o tom co znamená import třídy. Zmíníme se i kontrole přístupu. Doba potřebná k prostudování této kapitoly: 60 minut
Třída je v Javě základním stavebním prvkem. Veškerý kód i data aplikace
usí být obsaženy ve třídách. Každá třída musí být potomkem kořenové třídy Object,
akže se vytváří jen jediná stromová struktura. Object je v Javě jediná třída, která nemá
ředka. Aby se nám to nepletlo můžeme říct, že koupaliště je třída. Termální koupaliště
Červené Lhotě pak je objektem..
Object
Třída 1
Třída 3
Třída 4
Třída 2
Třída 6
Třída 5
Obr.9
27
Obecná deklarace třídy vypadá takto:
[ modifikátor ] class jménoTřídy
[ extends jménoRodičovskéTřídy ]
[ implements seznamRozhraní ]
{ // tělo třídy }
Modifikátorem třídy rozumíme klíčové slovo, které nám říká o jaký typ třídy se
jedná.
Nejčastěji užívanými modifikátory jsou Public – Označuje veřejnou třídu, dostupnou i mimo balík
Abstrakt – Deklarována třída je pouze abstraktní.
Final – Oznamuje ukončení rodičovského procesu. Nemá další potomky.
Static – Odkazuje se pouze na svou třídu
Void – Určuje, že metoda main, nevrací žádnou hodnotu, jako
výsledek
Mohou následující třídu užít i jiné třídy? A kdy? class MujProgram1 { public static void main (String args[]) { System.out.println ("Dobry Den!"); } }
Vytvořte z této aplikace applet. Nezapomeňte importovat java.applet.*, java.awt.*
System.out.println vám vypíše oznámení na obrazovku. Pro applet použijte funkci,
g.drawString().
Args[] je deklaraci pole typu "String" a přijímá parametry z příkazového řádku.
Main je metodou. V další kapitole si o metodách něco povíme.
28
Není-li třída veřejná je dostupná pouze ve svém balíku. Podívejme se na příklad
abstraktní třídy. Vytvoříme třídu, ve které definujeme, Integer, Boolen, Real a danou
třídu nazveme Number. Pokud pak budeme chtít tuto třídu použít, musíme ji zavolat jako
Number, ale nevíme jestli budeme pracovat s integrem, nebo boolenem. Tuto třídu tedy
deklarujeme jako abstraktní.
5.4.1. Atributy a metody třídy
Atributy třídy popisují data třídy. Jsou deklarovány stejně jako lokální proměnné.
Naproti tomu, metody jsou funkce třídy. Definice metody začíná určením typu vracené
hodnoty. Pokud funkce (metoda), žádný typ nevrací, označujeme jí jako void.
Metody Javy musejí být definovány uvnitř třídy. Třída Javy by měla splňovat
následující podmínky:
Třída Javy splňuje:
Dobře definované API
Název třídy by měl být odvozený od její funkce. Mělo by být jasné
co třída dělá.
Třída by měla obsahovat všechny funkce, které ke své činnosti
potřebuje. Pokud tomu tak není mělo by být přesně definováno odkud
a které metody přejímáme z jiných tříd.
Třída by měla být odolná proti neobvyklým vstupům.
29
5.4.2. Import třídy
Slovo „import“ umožní aplikaci a appletu využít jíž hotových tříd. Pro vytváření
appletů je v Javě vytvořená třída java.applet.Applet.*, která definuje třídy webovských
nástrojů Javy. Podívejme se na důležité třídy, které můžeme s výhodou importovat
Java.applet – pro tvorbu webovských appletů
Java.awt – využívá grafické prostředí
Java.io – práce se standardními IO zařízeními (myš, klávesnice)
Java.lang – je automaticky přiřazena, není třeba vypisovat.
Java.net – přistupuje k sítí
Java.util – obsahuje různé utility
Klíčové slovo import je funkčně shodné s C-vským #include.
V čem se od sebe liší import a include?
Příklad importu tříd import java.awt.Graphics; import java.applet.Applet; public class DobryDen extends java.applet.Applet { public void paint (Graphics g) { g.drawString("Dobry Den!", 20, 20); } }
Příklad 7
Obr.10
30
5.4.3. Kontrola přístupu
Java dovoluje kontrolovat přístup ke třídám pomocí specifikací public a private.
Pokud neoznačíme třídu jedním z těchto znaků, říkáme že třída je přátelská. Veřejné třídy a
jejich atributy jsou volně dostupné. Privátní atributy jsou dostupné pouze atributům stejné
třídy. Možná že se vám zdá, že rozlišování tříd na veřejné a privátní je zbytečná
komplikace. Pojďme se na tento případ podívat blíž.
Privátní metody jsou myšlené jako pomocné a vykonávají skutečnou práci
programu. Díky tomu, že existují pouze v rámci určité třídy, nemůže se nám stát, že by
došlo ke kolizi uvnitř programu.
Programem může procházet jedna proměnná, která bude nabývat určitých hodnot,
lišících se krok od kroku. Díky zprivátnění si můžeme být jistí, že ta daná třída pracuje
s hodnotou, která ji přísluší, i když uvnitř nějaké jiné třídy má proměna už hodnotu úplně
jinou.
31
5.5. Metody
V této kapitole se dozvíte o: metodách tříd, zjistíte jakou funkci mají metody uvnitř třídy a jak vznikají objekty. Doba potřebná k prostudování této kapitoly: 15 minut
Jak jste si už jistě všimli třída obsahuje celý program. Z toho vyplývá že součástí
třídy jsou proměnné, funkce a taky metody. Metoda je vlastně funkce, která se uvnitř třídy
volá. Pojďme se podívat na jednoduchý příklad.
public class trida1 // mam class trida1 ve kterém definuji proměnnou i { int i; public trida1() // priradim promene i hodnotu 3, je to metoda { i = 3; } public void Pricti(int j) // Pricteni 3 k hodnote j, je to metoda { i = i + j } }
Příklad 8
Třída Trida1 obsahuje proměnnou „i“ a dvě metody. První metodou je Trida1() a
je konstruktorem třídy (class trida1). Druhou metodou je Pricti(int j).
Konstruktor trida1() inicializuje třídu Trida1. Pokud bych chtěl v rámci této třídy
vytvořit novou instanci (např. novou funkci, která se nebude odkazovat na hodnotu
v Trida1), použiji k tomu příkaz new.
Novatrida trida2;
Trida2 = new novatrida();
Co je zde konstruktorem?
32
5.6. Balíky
V této kapitole se dozvíte o: tom jakým způsobem vytvoříme balík příbuzných tříd. Povíme si o vyjímkách v běhu programu. Doba potřebná k prostudování této kapitoly: 30 minut
Balík (package), je množina tříd, které logicky patří k sobě. Je to obdoba knihovny a
zároveň prostoru jmen z C++. Každá třída patří do jednoho balíku. Buď je pevně daná do
kterého, nebo bude patřit do nepojmenovaného balíku.
Pamatujete si na hvězdičkovou konvenci? Pokud napíšu import java.awt.*,
importuji všechny třídy v balíčku awt.
Java umístí každý balíček do vlastního adresáře. Jméno adresáře je shodné se
jménem třídy. Tečka se nahrazuje opačným lomítkem. Tedy třídy balíčku awt budou
umístěny v adresáři c:\java\awt. Cesty vytvořených tříd nemusí začínat v kořenovém
adresáři. Java se dívá na proměnnou prostředí CLASSPATH, podle které hledá požadovaný
soubor. CLASSPATH nastavíme tak aby obsahoval všechny adresáře, do kterých umisťujeme
naše třídy.
33
5.6.1. Tvorba a použití balíčků
Každá třída je součásti balíčku. Třída je k balíčku přidaná při překladu. Třída
označuje balíček, ke kterému patří použitím klíčového slova package. Někdy je lepší pokud
při práci s velkým programem pracujeme s několika na sobě nezávislými třídami, přesto ale
potřebujeme, aby v konečném důsledku spolupracovali. K tomu nám slouží známý příkaz import.
Pokud chceme mít přístup ke všem třídám balíčku, použijeme syntax import
package1.subpackage.*;. Můžeme tedy říct, že třídy jsou kombinovány do shluků
označovaných jako balíčky.
Java mapuje koncepci balíčků do stromové struktury operačního systému na
platformě nezávislým způsobem.
Třída Object je nadtřídou všech tříd. Všechny třídy dědí metody z třídy Object.
Můžeme tedy říct, že třída Object je balíkem všech tříd.
34
5.6.2. Výjimky
Výjimka je prostředek, kterým Java detekuje a oznamuje chyby. Výjimka je
chybový stav, který přeruší chod programu. Pojďme se podívat na příklad package srd.math; import java.lang.Exception; class ComplexNumber { private double m_dReal; private double m_dImag; // konstruktory public ComplexNumber(double dR, double dI) { m_dReal = dR; m_dImag = dI; } public ComplexNumber(double dR) { this(dR, 0.0); } // operátor dělení napsaný pro použití výjimek public ComplexNumber Divide(double d) throws Exception { if (d == 0) { throw new Exception("Pokus o dŘlenˇ nulou v ComplexNumber.divide"); } return new ComplexNumber(m_dReal / d, m_dImag / d); } public String toString() { StringBuffer sb = new StringBuffer(); sb.append('(').append(m_dReal).append(','); sb.append(m_dImag).append(')'); return sb.toString(); } }
Příklad 9
Pokud je d rovno nule, rovnice nemá řešení. (dělení nulou). Pokud k tomu dojde
divide vyvolá výjimku obsahující chybovou zprávu.
35
5.7. Výrazy řízení běhu programu
V této kapitole se dozvíte: výrazech, které definují jakým způsobem bude program zpracováván. Seznámíte se s jejich syntaxí a způsobem využití. Doba potřebná k prostudování této kapitoly: 45 minut
Každý programovací jazyk musíme nějak řídit a přinutit aby dělal to co chceme(i
když někdy máme pocit, že si program dělá co chce on a ne my). K tomu slouží výrazy,
kterými vlastní běh programu řídíme. Pojďme si je ukázat, ať se můžeme pustit do vlastního
bezproblémového programování.
36
5.7.1. Komentář
Pokud budete programovat složitější aplikaci, nebo applet, jistě vám v určitém
okamžiku přijdou vhod komentáře. Díky ním se můžete hravě vyznat i v napohled složitém
kódu. Komentáře můžeme uvést více způsoby, podle toho jestli se nám vejde na jeden nebo
více řádků. Komentáře uvozujeme do lomítek podobně jako v jazyce C.
//komentář
/*komentář na více řádcích*/
/** komentáře k dokumentaci**/
Napište program s komentářem k dokumentaci. Ověřte si, funkčnost programu javadoc.exe
5.7.2. Identifikátory
Identifikátorem rozumíme symbol, kterým prezentujeme proměnnou, třídu, objekt
atd. Identifikátorem může být jakýkoli symbol nebo slovo začínající písmenem,
podtržítkem nebo označením dolaru $.
5.7.3. Literály
Literátem rozumíme číselný typ vyjadřující velikost uložení čísla v paměti. V javě
používáme typy integer, float, boolean, char a string. Jsou shodné s definicí v C
a C++. Není je tedy třeba uvádět.
37
5.7.4. Pole
Pole deklarujeme z libovolné platné proměnné. I zde platí stejná pravidla jako
v jiných programovacích jazycích. int i [] [] = new int [3] [6];
Jak je vidět, v jazyce Java je pole objektem. Délku pole zjistíme funkci length
dotazem proměnná.length.
S výhodou užijeme zápisu string pole [] = {“x1”,”x2”,x3}; předtím ovšem
musíme nadefinovat jakého druhu budou hodnoty polem obsažené.
Tedy dle příkladu osm nadefinujeme string pole [] = int [3]. Z toho vyplývá,
že výsledné pole bude třímístné a bude obsahovat proměnné typu integer.
5.7.5. Operátory
Tak jako u většiny případů, jsou i operátory Javy velmi blízké operátorům jazyka C.
Na rozdíl od jazyka C, Java podporuje operace typu:
“string1“ + “string2“=string1string2“
38
5.7.6. Větveni programu
Nejdůležitější vlastnosti všech programovacích jazyků je schopnost vykonat příkaz
pokud je splněna jedna podmínka, a zároveň vykonat jiný, pokud je splněná podmínka
druhá. Větvení v Javě je (jaké překvapení ☺) téměř shodné z jazyků C++, C či Pascal.
Podívejme se na syntaxi příkazů if, then, else: if (splneno)
{ prikaz;
} else {
prikaz; }
Další z možností jak větvit program je pomoci příkazu switch-case:
switch (vyraz1) { case hodnota1:
prikaz1; break;
case hodnota2: prikaz2; break; default: prikaz3; break;
}
39
5.7.7. Smyčky
Smyčky jsou cykly, které provádí určitou operaci, která bude ukončená po splnění
určité podmínky. Smyčky, které znáte z C, C++ nebo Pascalu, použijete i v Javě. Podívejme
se na jejich syntaxi
For for (pocatecni hodnota; testovaci podminka; prirustek) { prikaz; } While while (vyraz je pravdivy) { prikaz; }
Do do { prikaz; } while (vyraz je pravdivy);
40
5.8. Vstup a výstup
V této kapitole se dozvíte: jakým způsobem se zpracovávají vstupní parametry zadané z klávesnice. Budete je umět snímat do programu a zpracovávat jejich výstup. Poznáte také jak načítat ze souboru a ukládat do souboru. Doba potřebná k prostudování této kapitoly: 75 minut
Veškeré operace vstupu a výstupu z klávesnice má na starosti balíček java.io.
Charakteristickým rysem celé Javy je skládání jedné třídy ke druhé. Tak je tomu i v tomto
případě.
Java se nesnaží obsáhnout jednou třídou veškeré možnosti, protože je
pravděpodobné, že všechny schopnosti potřebovat nebudete. Pokud potřebujete provést
operaci, která aktuální třídou není podporovaná, jednoduše ji přiřadíte. Výhody jsou
nasnadě.
Podívejme se jakým způsobem zpracováváme vstupní a výstupní operace. Během
našeho povídání jsme se už setkali s třídou Systém. Pamatujete si jakým způsobem třída
system posílala výstup na monitor? system.out.println(“Dobry den”); Vedle toho tato třída obsahuje prvky system.in – standardní vstup system.err - chybový výstup Podívejme se na to jak se tyto metody používají.
41
import java.io.*; public class vstupvystup { public static void main(String[] args) { try { // zkusíme číst z klávesnice byte bArray[] = new byte[128]; System.out.println("Neco napiste:"); // Tento příkaz cte pole bajtů System.in.read(bArray); // výstup pole bajtů - toto generuje // vlastní výsledek System.out.print("Napsal jste:"); System.out.println(bArray); // co se s tim vlastne ma delat? Class cInClass = System.in.getClass(); Class cOutClass= System.out.getClass(); System.out.println("in je " + cInClass.toString()); System.out.println("out je " + cOutClass.toString()); } catch(IOException ioe) { System.out.println(ioe.toString()); ioe.printStackTrace(); } } }
Příklad 10
Obr.11 Proč je výstup tohoto programu zmatený?
42
import java.io.*; public class vstupvystup2 { public static void main(String[] args) { try { // zkusíme číst z klávesnice byte bArray[] = new byte[128]; System.out.println("Neco napiste:"); // Tento příkaz čte pole bajtů System.in.read(bArray); // zkonvertuje pole na řetězec před tím, než se // jej pokusí zobrazit String s = new String(bArray, 0); System.out.println(s); } catch(IOException ioe) { System.out.println(ioe.toString()); ioe.printStackTrace(); } } }
Příklad 10 Nyní už je výstup v pořádku.
43
5.8.1. Práce se soubory
Požadavky na práci se soubory jsou jasné. Potřebujeme vědět jak do souboru
můžeme něco uložit resp. jak ze souboru něco vytěžit. Pokud chceme soubor otevřít a něco
do něj uložit, využijeme třídu FileInputStream. Pokud naopak chceme soubor otevřít a
něco z něj dostat využijeme třídu FileOutputStream.
Podívejme se na následující program. Ten načte dvě jména souboru jako parametry
a potom zkopíruje obsah prvního souboru do druhého.
import java.io.*; public class soubor { public static void main(String[] args) { try {
// otevře args[0] pro vstup FileInputStream in = new FileInputStream(args[0]); // přidá tomuto proudu vyrovnávací paměť BufferedInputStream bin = new BufferedInputStream(in); // otevře args[1] pro výstup a také přidá // vyrovnávací paměť FileOutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); // nyní čte tak dlouho, dokud je co číst byte bArray[] = new byte[256]; int nBytesRead; while(bin.available() > 0) { // přečte blok - pamatuje si, kolik přečetl nBytesRead = bin.read(bArray); // zapíše stejně tolik znaků zpět od // indexu 0 do pole bout.write(bArray, 0, nBytesRead); } bout.flush(); } catch(IOException ioe) { System.out.println(ioe.toString()); } } }
Příklad 12
44
Program otevře vstupní soubor třídou FileInputStream. Program pak zabalí objekt
in třídy FileInputStream do objektu třídy BufferedFileInputStream, který označuje
bin.
Program opakuje proces s druhým argumentem pro výstupní soubor, čímž vytvoří
objekt bout třídy BufferedoutputFile.
45
import java.i public class { public st { try { / F B / F B P / b i w {
Podívejte se na následující program a ověřte jeho funkčnost
o.*;
FileIO
atic void main(String[] args)
/ použije normální vstupní proud ileInputStream in = new FileInputStream(args[0]); ufferedInputStream bin = new BufferedInputStream(in);
/ vytvoří výstupní proud s vyrovnávací pamětí ileOutputStream out = new FileOutputStream(args[1]); ufferedOutputStream bout = new BufferedOutputStream(out); rintStream pout = new PrintStream(bout);
/ čte osm znaků najednou yte bArray[] = new byte[8]; nt nBytesRead; hile(bin.available() > 0) // nejprve je vypíše jako hexadecimální číslo nBytesRead = bin.read(bArray); for (int i = 0; i < nBytesRead; i++) { int nByte = (int)bArray[i]; String s = Integer.toString(nByte, 16); if (s.length() == 1) { pout.print(" "); } pout.print(s + ", "); }
// potom, pokud jsou tisknutelné, vypíše // příslušný znak (pokud ne, vypíše tečku ".") pout.print("-"); for (int i = 0; i < nBytesRead; i++) { char c = (char)bArray[i]; if (Character.isDigit(c) || Character.isLowerCase(c) || Character.isUpperCase(c))
46
{ // podrží si c - nic nedělá } else { c = '.'; // nahradí c tečkou } pout.print(c); } pout.println(" "); } bout.flush(); } catch(IOException ioe) { System.out.println(ioe.toString()); } } }
Příklad 13.
47
5.9. Zpracováni vstupu a výstupu myši
V této kapitole se dozvíte: jakým způsobem se zpracovávají události myši Doba potřebná k prostudování této kapitoly: 30 minut
Vedle zpracování vstupu a výstupu ze standardních vstupních a výstupních zařízení,
je velmi užitečnou vlastnosti Javy spolupracovat s myši prostřednictvím zpracování události
(events). Nejběžnější události u myši je kliknutí.
Ke zpracování používá Java metody mouseDown()a mouseUp(). Obě tyto metody
jsou součásti balíku třídy java.awt.Component.
public boolean mouseDown (Event e, int x, int y) { /* tlacitko mysi stlaceno dolu, pozice na obrazovce je reprezentovana souradnicemi x a y */ /* nasleduje zpracovani teto udalosti */ } public boolean mouseUp (Event e, int x, int y) { /* tlacitko mysi uvolneno, pozice na obrazovce je reprezentovana souradnicemi x a y */ /* nasleduje zpracovani teto udalosti */ }
48
Následující applet tiskne text “Dobry den” v místě kde se nachází kurzor myši v
okamžiku kliknutí se nachází.
import java.awt.Graphics; import java.awt.Event; import java.applet.Applet; public class klikMys extends Applet { int Sour_X = 30; int Sour_Y = 30; public void paint (Graphics g) { g.drawString("Dobry Den", Sour_X, Sour_Y); } public boolean mouseDown (Event e, int x, int y) { Sour_X = x; Sour_Y = y; repaint(); return true; } }
Příklad 14
Dvojklikem zde, zobrazíte originální stránku
49
5.10. Síťové programování v prostředí TCP/IP
k
s
T
j
V této kapitole se dozvíte: o základech síťového programování, setkáte se s pojmy jako je socket, a prostředky balíku java.net. Doba potřebná k prostudování této kapitoly: 45 minut
Programování v prostředí TCP/IP využívá tzv. socketů, což jsou koncové body
omunikačních linek mezi procesy charakterizované IP adresou a portem. Sockety nejsou
pecifickou záležitosti Javy, ale jsou všeobecným základem síťového programování pro
CP/IP. V jazyce Java lze TCP/IP spojení navázat za použití knihovny třídy java.net a to
ak pro datové přenosy TCP, tak i UDP. Spojení popíšeme takto:
Server je spuštěn na předem určeném portu a čeká na klientsky program,
aby navázal spojeni.
Jakmile si klient toto spojeni vyžádá, server otevře socketové spojeni
prostřednictvím metody accept().
klient rovněž založí spojeni se serverem na dané IP adrese a určitém
portu.
50
Obě strany pak komunikuji prostřednictvím metod InputStream() a OutputStream().
Použití základních principu implementace serveru v Javě ukazuje následující příklad. ServerSocket srvsocket; Socket sckt; String sendstr = "Data ze serveru.\n"; int delka; OutputStream outstr; srvsocket = new ServerSocket(8888,300); // server je pripojen na // port 8888, ceka 300 sekund // na zavolani klienta sckt = srvsocket.accept(); // server ceka na pripojeni outstr = sckt.getOutputStream(); // ziska identifikaci socketoveho // souboru delka = sendstr.length(); // delka zasilanych dat for (int i=0; i < delka; i++) { outstr.write((int)outstr.charAt(i)); } // posila data po jednom byte sckt.close(); // ukonci spojeni
Klientský program pak principiálně může vypadat takto: int c; Socket sckt; InputStream instr; // klientsky program sckt = new Socket("javaserv",8888); // otevre spojeni s pocitacem // javaserv, na portu 8888 instr = sckt.getInputStream(); // ziska identifikaci socketoveho // souboru while ((c = instr.read()) != -1 { // cte jeden byte prichazejici // ze serveru System.out.println((char)c); // tiskne prijaty byte na vystup } sckt.close(); // uzavre spojeni
Příklad 15
Jak je vidět, tak na straně serveru je to třída ServerSocket a na straně klienta třída
Socket, které zajišťuji, že implementace je velmi jednoduchá a přehledná. Pokud se chystáte
k vývoji přenosných aplikaci v prostředí TCP/IP, pak podrobnější studium knihovny třídy
java.net je zcela na miste.
51
6. Test č.1
v
T
T
V této kapitole se dozvíte: Jakým způsobem budete zpracovávat test pro ukončení první polovinysemestru. Doba potřebná k prostudování této kapitoly: 5 minut Doba potřebná k vypracování testu: 90 minut
Zakončením první poloviny tohoto kurzu je test, ve kterém by jste měli potvrdit své ědomosti. Pro jeho úspěšné vykonání musíte odpovědět alespoň na polovinu otázek.
Zadaný program musíte vytvořit tak, aby byla funkční alespoň jeho jedna polovina.
est najede kliknutím na obrázek . Jako jméno zadejte své příjmení, jako heslo vaše jméno+2002.
EST
52
TEST č.1 - XJAV1 - OOP pro Internet a Intranet
Používáte prohlížeč Microsoft Internet Explorer 4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Pro správné zobrazení češtiny použijte kódování: Středoevropské jazyky Windows
Jadro: Win32 Rozlišení: 1024 x 768 Barevná hloubka: 16 bit Java povolena ?: ANO
Anti-aliasing ?: NE
Uživatelské jméno: Heslo:
1.Otázka
Jakým příkazem připojíte třidu
A include
B import
C load
2.Otázka
Jak se nazývá způsob odstraňujicí objekty?
A destruktor
B garbage colection
C neodstraňuji se
3.Otázka
Hvězdička znamená
A import všech tříd balíčku
B import všech funkcí třídy
C import všech metod funkce
53
4.Otázka
Jak se jmenuje základní knihovna Javy,
která musí být vždy importována
A java.io
B java.awt
C java.lang
5.Otázka
Popište v jakých krocích vytvoříte a následně spustíte aplikaci
vytvořenou v Javě.
6.Otázka
Co si představujete pod pojmem JAVA VIRTUAL MACHINE?
7.Otázka
Popište rozdíl mezi třídou a metodou, uveďte alespoň dva příklady
54
8.Otázka
Vytvořte libovolný program, ve kterém použijete konstruktory.
Program popište a zajistěte odstranění objektu
(popište funkci finalizéru)
Zdrojovy kod zadaneho programu v jazyce JAVA
9.Otázka
Vytvořte program, který přečte z klávesnice tři čísla, seřadí je od
nejvetšího do nejmenšího, vytiskne je v tomto pořadí, vytiskne jejich součin
a převrácenou hodnotu každého z těchto čísel. Ošetřete případ dělení nulou.
Dále převeďte součet těchto čísel do binárního tvaru.
Zdrojovy kod zadaneho programu v jazyce JAVA
Doporučení
Na toto místo napište své jméno a emailovou adresu
Jmeno PrijmeniEmail
Potvrdit-Odeslat Smazat-Znovu
55
7. Vývojové prostředí Javy - Applety
V této kapitole se dozvíte: o editorech umožňující programování appletů. Doba potřebná k prostudování této kapitoly: 45 minut
Programovat applety můžete pod libovolným textovým editorem jako je například
např. notepad či joe (Linux). Přesto je lepší vytvářet applety pod kvalitním nástrojem který
umožňuje tvorbu HTML stránek. Nejvhodnějším v tomto směru se mi zdá tzv. HTML-Kit
od společnosti Chami, který si můžete stáhnout zde.
Obr.12
Ovládání tohoto produktu je intuitivní, a nechám na vás ať se s ním seznámíte.
56
7.1. Práce s textem a grafikou
p
J
r
P
a
p
V této kapitole se dozvíte: čeho se vyvarovat při tvorbě webovské stránky, naučíte se pracovats technickými vlastnostmi textu. Doba potřebná k prostudování této kapitoly: 45 minut
Pokud jste se přenesli přes minulé kapitoly bez problémů, ujišťují vás, že zbytek už
ůjde hladce. Od této chvíle se budeme věnovat vlastní práci s dynamickými možnostmi
avy. Budeme se soustředit na vytváření appletů a jejich umístění na webovské stránky.
Když otvíráme webovskou stránku, první čeho se dočkáme jsou slova. Tvar barva a
ozmístění slov rozhodne o tom jestli vůbec budeme čekat na to, až se stránka načte celá.
rvní věc, kterou bychom si měli říct je, že v jednoduchosti je síla.
Stránka, která bude přecpaná grafikou, různými scripty, applety, blikajícím pozadím
bůhví čím ještě, se jednak bude pomalu načítat, a jednak naštve případného návštěvníka,
rotože si uvědomí jak ho bolí od toho počítače oči.
57
7.1.1. Vložení textu
Pokud budeme chtít něco vytisknout na monitor počítače, viděli jsme, že k tomu
použijeme metodu system.out.println(). Pokud budeme pracovat s appletem jako
výstup použijeme metodu g.drawString.
public void paint(Graphics g) { g.drawString(“Neco zvlastniho”, 20, 20); } Jak je vidět metodu drawString(“string“, X, Y); deklarujeme tak, že nejprve
napíšeme řetězec a za něj souřadnice textu.
Tuto metodu můžete používat pokud inicializujete třídu Applet, která zajišťuje
všechny podpůrné třídy pro tvorby appletů. Podívejme se na ni:
- init() je spuštěna pouze jednou během zaváděni appletu. Pokud
není redefinovaná uživatelem, nevykonává žádnou funkci.
- start() začíná běh appletu. Tato metoda sama o sobe nevykonává
žádnou funkci. Odvozenou metodu lze použít k započetí animací,
přehrávek zvuku apod.
- stop() konci běh appletu. Metoda je spouštěna, když applet již
není na obrazovce. Tato metoda sama o sobe nevykonává žádnou
funkci. Odvozenou metodu lze použít k zastaveni animace, přehrávky
zvuku apod.
- destroy() tato metoda je k dispozici k použití, jestliže applet
již není nadále potřeba. Sama o sobe nevykonává žádnou funkci.
Odvozena metoda je vhodná k závěrečnému ošetření appletu, jako
např. u multitaskových aplikaci k zastaveni všech aktivních úloh.
- paint(Graphics g) tato funkce je spoustena vždy, když zobrazovací
oblast apletu potřebuje znovuzobrazení (refresh) výstupu. Základní
metoda třídy Applet pouze zobrazí šedý rovnoběžník v oblasti
grafického výstupu appletu. Odvozena metoda je využívána k
grafickému výstupu zobrazované informace (text, grafika atd.)
Povšimněte si odvozené metody v našem prvním apletu, kdy jsme
redefinovali tuto metodu tak, aby vypsala text "Dobry den!".
-update(Graphics g) tato metoda je použitá vždy, když je třeba
aktualizace zobrazené oblasti. Základní metoda třídy Applet smaže
vše co je zobrazeno v dané grafické oblasti apletu a pak spustí
metodu "paint".
58
7.1.2. Typy písma
Teď, když víme jak zobrazit zprávu v rámci appletu, podíváme se jak můžeme
ovlivnit tvar písma. Pokud žádné písmo nedefinujeme, pak se text vypisuje standardním
typem písma, které je označováno jako „dialog“. Pokud chcete zvolit jiné písmo než
standartní, musíme vytvořit objekt „Font“.
Font f = new Font (“typ pisma”, Font.PLAIN, 12);
Font.PLAIN určuje velikost fontu. Typem písma se rozumí o jaký normativ se jedná.
Standardními písmy Javy jsou. Courier, Dialog, Helvetica, TimesRoman, DialogInput, a
pismo pro zvláštní znaky ZapDingBats.
Podívejme se na inicializaci nového fontu v následujícím příkladu Public void paint (Graphics g) { Font f = new Font (“Helvetica”, Font.PLAIN, 10); g.setFont(f); }
Vytvořte applet, který zobrazí alespoň tři typy fontů na stránce.
59
7.1.3. Barva písma
Tak jako jsme typ písma určovali metodou „Font“ tak barvu volíme metodou „Color“. Public void paint (Graphics g) { g.setColor(Color.blue); //Dokud nenastavim barvu jinak budou vsechny texty modre g.drawString(“Je to psane modrym pismem”); }
Java obsahuje standardní barvy podobně jako Pascal nebo C++, proto je nebudu
vypisovat.
Pokud vaše nároky na barvu budou větší, můžete si vlastní nádech namíchat
podobně jako když ladíte televizi, kombinací červené, zelené a modré. Barvy zadáváte v
rozsahu (0 až 255).
Public void paint (Graphics g) { Color barva = new Color (255,0,0); g.setColor(barva); g.drawString(“Cervena barva”, 10, 10); }
Pokud jsme puntičkáři můžeme si dokonce volit i mezi jasem, metodou „brighter“ a darker.
60
7.2. Vykreslování geometrických tvarů
V této kapitole se dozvíte: o tvorbě jednoduchých grafických objektů a jejich začlenění do HTMLstránky. Doba potřebná k prostudování této kapitoly: 45 minutNejjednodušším grafickým objektem, který Java poskytuje je čára. Různými
změnami parametrů docílíme kresbu obdélníků mnoho úhelníků. Přesto je však jednodušší
využít vestavěných grafických objektů, od již zmíněných obdélníků, až po půlkruhy a
výseče.
7.2.1. Kreslení čar
Kreslení čar zajišťuje metoda „drawLine“. Metodě zadáte koncové body čáry a
ta se vykreslí v aktuální barvě. Tuto metodu použijte takto:
Public void paint (Graphics g) { g.drawLine(10, 200, 100, 200); } Zadané hodnoty odpovídají souřadnicím koncových bodů čáry.
7.2.2. Kreslení obdélníků
Tak jako pro kreslení čáry existuje metoda drawLine(), tak pro kreslení obdélníků
máme metodu „drawRect()“.
Public void paint (Graphics g) { g.drawRect(100,100,100,100); }
V tomto případě se nám vykreslí čtverec, který nezakryje oblast ve které se nachází.
Abychom toho docílili musíme zadat výplň metodou clearRect(). Pokud chceme
dosáhnout určité barvy výplně použijeme metodu fillRect(). Barva výplně odpovídá
aktuální barvě.
61
Sestrojte program pro vykreslení čtyř obdélníků, každý jinou barvou. Sestrojte
obdélníky tak aby tvořili jeden společný obdélník.
Další metody, které vykreslují obdélníky jsou DrawRoundRect(x,y,z,v) //zakulacené rohy FillRoundRect(x,y,z,v) Draw3DRect(x,y,z,v,true nebo false) // trojrozměrný obdélník Fill3DRect(x,y,z,v,true or false)
62
7.2.3. Kreslení kružnic a oblouků
Kružnice je nejproblematičtějším geometrickým obrazcem, který počítač vykresluje.
Každý programovací jazyk má odlišné rutiny a algoritmy, kterými kružnice vykresluje.
Java nabízí rutinu kreslení okraje a výplně oválného tvaru. Metody kterými se
kružnice (elipsa) vykreslují jsou
drawOval (int x, int y, int sirka, int vyska); fillOval (int x, int y, int sirka, int vyska); Pokud potřebujeme vykreslit půlkružnice oblouky výseče a podobně, použijeme
metody
drawArc (int x, int y, int sirka, int vyska, int uhel, int uhel); fillArc (int x, int y, int sirka, int vyska, int uhel, int uhel);
První úhel je úhlem počátku, druhý je úhlem oblouku.
63
7.3. Události myši a klávesnice
V této kapitole se dozvíte: jakým způsobem zpracujeme a vyhodnotíme události spojené se stiskem klávesy či kliknutím myši. Doba potřebná k prostudování této kapitoly: 60 minut
7.3.1. Události myši
Myš je v současné době velmi vytížené zařízení počítače. Často mnohem více než
klávesnice. Zatímco klávesnice přenáší pouze jeden údaj(většinou), myš jich přenáší hned
několik. Pojďme se na ně podívat:
Pozice – Souřadnice myši jsou definovány od levého horního rohu
monitoru.
Stav – Podává informaci o stavu tlačítek myši.
Povaha – Informuje o současném stavu myši. Zda se myš pohybuje a
podobně.
Java neposkytuje informace o vícetlačítkových myších (standardně)
64
Podívejme se na applet, který vykreslí informace o kurzoru
import java.applet.*; import java.awt.*; public class CrossHair extends Applet { private Dimension m_dimCursorLoc; // pozice kurzoru private boolean m_bDrag; // TRUE -> zrovna tahneme mys public void init() { resize(640, 480); } public void paint(Graphics g) { // nejprve vytvorime retezec obsahujici aktualni pozici // ve formatu (xx,yy) a tu pote vypiseme String sCursorLoc = "(" + m_dimCursorLoc.width + "," + m_dimCursorLoc.height + ")"; g.drawString(sCursorLoc, 10, 20); // nyni vykreslime x na pozici kurzoru mysi // (cerveny, pokud je mysi tazeno, jinak cerny) if (m_bDrag) { g.setColor(Color.red); } else { g.setColor(Color.black); } int nX = m_dimCursorLoc.width; int nY = m_dimCursorLoc.height; g.drawLine(nX - 2, nY, nX + 2, nY); g.drawLine(nX, nY - 2, nX, nY + 2); } // MOUSE SUPPORT: public boolean mouseDrag(Event evt, int x, int y) { // nastavy true je-li s mysi tazeno m_bDrag = true; // ulozi pozici mysi m_dimCursorLoc = new Dimension(x, y); repaint(); // vraceny true indikuje, ze jsme udalost zpracovali return true; } public boolean mouseMove(Event evt, int x, int y) { // stejne jako mouseDrag m_bDrag = false; m_dimCursorLoc = new Dimension(x, y); repaint(); return true; } }
Příklad 15.
65
Obr.12
Pokud pohybujeme kurzorem myši v levém horním rohu se nám objevuje údaj o
aktuální poloze. Atribut m_dimCursorLoc ukládá aktuální pozici myši.
Klikněte na obrázek
66
V následujícím příkladě si ukážeme applet, který reaguje na kliknutí myší. Označí
nám polohu myší a pak tyto body spojí.
import java.applet.*; import java.awt.*; public class ConnectTheDots extends Applet { // definovana data Dimension m_dimLocs[]; int m_nNumMouseClicks; // aktualni pozice kurzoru Dimension m_dimCursorLoc; public ConnectTheDots() { // inicializuje atributy objektu m_dimLocs = new Dimension[m_nMAXLOCS]; m_nNumMouseClicks = 0; m_dimCursorLoc = new Dimension(0, 0); } public String getAppletInfo() { return "Name: ConnectTheDots\r\n" + "Author: Stephen R. Davis\r\n" + "Created for Learn Java Now (c)"; } public void init() { resize(400, 400); } public void paint(Graphics g) { //Pozici kurzoru oznaci krizkem int nX = m_dimCursorLoc.width; int nY = m_dimCursorLoc.height; g.drawLine(nX - 2, nY, nX + 2, nY); g.drawLine( nX, nY - 2, nX, nY + 2); //nakresli caru for (int i = 0; i < m_nNumMouseClicks - 1; i++) { for (int j = i + 1; j < m_nNumMouseClicks; j++) { g.drawLine(m_dimLocs[i].width, m_dimLocs[i].height, m_dimLocs[j].width, m_dimLocs[j].height); } } } public boolean mouseDown(Event evt, int x, int y) { // ulozi pozici kliknuti if (m_nNumMouseClicks < m_nMAXLOCS)
67
{ m_dimLocs[m_nNumMouseClicks] = new Dimension(x, y); m_nNumMouseClicks++; // prekresleni repaint(); } return true; } public boolean mouseUp(Event evt, int x, int y) { // ignoruje tuto udalost return true; } public boolean mouseDrag(Event evt, int x, int y) { // ignoruje tuto udalost return true; } public boolean mouseMove(Event evt, int x, int y) { // ulozi pozici kurzoru a prekresli obraz m_dimCursorLoc = new Dimension(x, y); repaint(); return true; } }
Příklad 16
Obr.13
Všimněte si, že pokud jsou vámi vytvořené vzory složité, začínají při pohybu myši
blikat.
68
Poslední příklad ukazuje využití dvojkliku myši. Tento applet rozeberte a zjistěte jak
funguje import java.applet.*; import java.awt.*; import java.util.Vector; public class ConnectTheDots extends Applet { // toto je záznam o všech pozicích, kde bylo kliknuto Vector m_vLocs; // aktuální pozice kurzoru Dimension m_dimCursorLoc; public ConnectTheDots() { // inicializuje atributy objektu m_vLocs = new Vector(); m_dimCursorLoc = new Dimension(0, 0); } public String getAppletInfo() { return "Name: ConnectTheDots\r\n" + "Author: Stephen R. Davis\r\n" + "Created for Learn Java Now (c)"; } public void init() { resize(400, 400); } public void paint(Graphics g) { // vloží křížek na pozici kurzoru int nX = m_dimCursorLoc.width; int nY = m_dimCursorLoc.height; g.drawLine(nX - 2, nY, nX + 2, nY); g.drawLine( nX, nY - 2, nX, nY + 2); // nyní nakreslí čáru od každé kliknuté pozice // ke všem ostatním kliknutým pozicím Dimension dimFrom; Dimension dimTo; int nSize = m_vLocs.size(); for (int i = 0; i < nSize - 1; i++) { dimFrom = (Dimension)m_vLocs.elementAt(i); for (int j = i + 1; j < nSize; j++) { dimTo = (Dimension)m_vLocs.elementAt(j); g.drawLine(dimFrom.width, dimFrom.height, dimTo.width, dimTo.height ); } } }
69
public boolean mouseDown(Event evt, int x, int y) { // pokud je kliknuto dvakrát ... if (evt.clickCount > 1) { // odstraní všechny prvky z vektoru m_vLocs.removeAllElements(); } else { // ... jinak přidá nový prvek m_vLocs.addElement(new Dimension(x, y)); } repaint(); return true; } public boolean mouseUp(Event evt, int x, int y) { // ignoruje tuto událost return true; } public boolean mouseDrag(Event evt, int x, int y) { // ignoruje tuto událost return true; } public boolean mouseMove(Event evt, int x, int y) { // uloží pozici kurzoru a překreslí obraz m_dimCursorLoc = new Dimension(x, y); repaint(); return true; } }
Příklad 17
70
7.3.2. Události klávesnice
Na klávesnici toho moc nejde udělat. Můžete buď zmáčknou tlačítko nebo pustit
tlačítko. Toto zpracovávají metody keyDown a keyUp. Speciálním tlačítkům jsou přiřazeny
kódy. Pojďme si ukázat příklad
Obr.14
Klikněte myši do okna a napište něco. Pak přesuňte myš jinam a pište dál import java.applet.*; import java.awt.*; import java.util.Vector; public class ScreenType extends Applet { // klávesy jsou ukládány do vektoru private Vector m_vKeys; // pozice aktuálního znaku private Dimension m_dimLoc; // metrika fontu pro okno tohoto apletu private FontMetrics m_fm; public ScreenType() { // vytvoří vektor s místem pro 100 klávesových objektů. // Nechá jej rozšiřovat o 100 najednou. To bude // rychlejší než implicitní hodnoty m_vKeys = new Vector(100, 100); // alokuje objekt Dimension m_dimLoc = new Dimension(10, 10); } public String getAppletInfo() {
71
return "Name: ScreenType\r\n" + "Author: Stephen R. Davis\r\n" + "Created for Learn Java Now (c)"; } public void init() { // nastaví počáteční velikost okna resize(320, 240); // pro ušetření času bere metriku fontu zde m_fm = getFontMetrics(getFont()); } public void paint(Graphics g) { // projde uložené objekty int nSize = m_vKeys.size(); for (int i = 0; i < nSize; i++) { // načte klávesu Key key = (Key)m_vKeys.elementAt(i); // od klávesy vezme její hodnotu a její pozici Dimension dimLoc = key.GetLoc(); char[] cKey = key.GetKey(); // vypíše klávesu i s pozicí g.drawChars(cKey, 0, 1, dimLoc.width, dimLoc.height); } } public boolean mouseDown(Event evt, int x, int y) { // při dvojkliku... if (evt.clickCount > 1) { // ...všechno smaže... m_vKeys.removeAllElements(); repaint(); } else { // ...jinak pouze upraví pozici m_dimLoc.width = x; m_dimLoc.height = y; } return true; } public boolean keyDown(Event evt, int nKey) { // přidá klávesu na aktuální pozici m_vKeys.addElement(new Key(nKey, m_dimLoc)); // provede minimální překreslení (pouze obdélník // obsahující nový znak) int nL, nR, nT, nB; nL = m_dimLoc.width; nR = nL + m_fm.charWidth(nKey);
72
nB = m_dimLoc.height; nT = nB - m_fm.getHeight(); repaint(nL, nT, nR, nB); // nyní upraví pozici následujícího znaku // přesunutím o šířku vkládaného znaku // (pamatujte si, že různé znaky mohou mít // různou šířku) m_dimLoc.width += m_fm.charWidth(nKey); return true; } } class Key { private char[] m_cKey; private Dimension m_dimLoc; public Key(int nKey, Dimension dimLoc) { // uloží znaky do pole velikost 1; // je to vhodnější kvůli metodě drawChars(), // která v metodě paint() chce jako parametr pole m_cKey = new char[1]; m_cKey[0] = (char)nKey; // použije stejný typ konstruktoru pro vytvoření // vlastní kopie objektu Dimension m_dimLoc = new Dimension(dimLoc); } Dimension GetLoc() { return m_dimLoc; } char[] GetKey() { return m_cKey; } }
Příklad 18
Každá klávesa je uložena jako prvek v poli m_vKeys třídy Vector. Metoda keyDown
uloží stisknutou klávesu spolu s pozicí.
73
7.4. Panely
V této kapitole se dozvíte: o významu o funkcích panelů na webovských stránkách a jejich vytváření Doba potřebná k prostudování této kapitoly: 30 minut
Panely na obrazovce reprezentují plochu, uvnitř které je možné pracovat s
jakýmkoliv appletem. Na plochu panelu umisťujeme různé grafické komponenty, případně
další panely.
Třída Applet, která je součástí vývojového prostředí, implementuje základní panel,
který můžeme použít jako základnu pro tvorbu jednoduchých grafických rozhraní.
Jednoduché tlačítko je zobrazitelné na panelu například takto:
import java.awt.*; import java.applet.Applet; public class Tlacitko extends Applet { Button tlacitko; public void init() { tlacitko = new Button("Klik"); add(tlacitko); } }
Příklad 19
Všimněme si zejména skutečnosti, že nový objekt, v tomto případe, se vytvoří příkazy: Button tlacitko1; tlacitko = new Button("Text"); a že po vytvoření tohoto objektu je třeba jej zaregistrovat prostřednictvím metody add.
Třída Button je součásti knihovny třídy java.awt. Text použitý při tvorbě tohoto
objektu je jednak zobrazen, ale také je dán zpět k dispozici danému appletu při zpracováni
události (event).
74
7.5. Zpracováni grafické události
V této kapitole se dozvíte: o způsobu zpracování události myši prostřednictvím grafických objektů jako jsou tlačítka odeslání či potvrzení. Doba potřebná k prostudování této kapitoly: 60 minut
Zpracováni události týkající se grafického tlačítka je podobné zpracováni události
myši. Vyžaduje předefinování metody action() daného appletu. Metoda action() je
součástí třídy java.awt.Component, z niž je třída Button odvozena. Zpracováni události tří
různých tlačítek pak může v appletu vypadat třeba takto: public class Buttons extends Applet { Button k1,k2,k3; public void init() { k1 = new Button("Tlacitko 1"); k2 = new Button("Tlacitko 2"); k3 = new Button("Tlacitko 3"); this.add(k1); this.add(k2); this.add(k3); } public boolean action (Event e, Object obj) { if (e.target == k1) System.out.println("Tlacitko 1 stlaceno."); if (e.target == k2) System.out.println("Tlacitko 2 stlaceno."); if (e.target == k3) System.out.println("Tlacitko 3 stlaceno."); return true; } }
Příklad 20
75
7.5.1. Další typy grafických objektů
Java umožňuje zobrazováni nejen standardních tlačítek, ale umožňuje i tzv.
výběrová tlačítka (choice button), potvrzovací políčka (checkbox) a další. Tyto jsou k
dispozici třídami java.awt.Choice a java.awt.Checkbox. Výběrová tlačítka (choice buttons)
umožňují rychlý přístup ke krátkému seznamu položek. Například výběr dnů v týdnu Choice DnyvTydnu; DnyvTydnu = new Choice(); DnyvTydnu.addItem("Pondeli"); DnyvTydnu.addItem("Utery"); | | DnyvTydnu.addItem("Nedele"); Opět i zde platí, že text zadaný metodou addItem() je vracen v parametru Object při
výskytu události pro zpracováni. Cely objekt je pak zaregistrován prostřednictvím metody add() add(DnyvTydnu);
Zpracováni události výběrového tlačítka public boolean action (Event e, Object obj) { if (e.target instanceof Choice) { String den = (String)obj; System.out.println ("Vybrany den je "+ den); } return true; }
Příklad 21
Potvrzovací políčka (checkbox) jsou často používaný ke grafickému vyjádření
určitého stavu, neboť mají pouze dvě možné hodnoty (stlačen, nestlačen). Hodnota tohoto
tlačítka je pro zpracování události předaná prostřednictvím parametru Object. Tento
parametr nabývá pouze booleovských logických hodnot true a false, podle toho jestli je
policko zatrženo (stlačeno) nebo ne. Zpracování takové události může vypadat takto: Checkbox AnoNeTlacitko; AnoNeTlacitko = new Checkbox("Vyber Ano"); public boolean action(Event e, Object obj) { if (e.target instanceof Checkbox) { System.out.println("Vybrano ANO: " + obj.toString()); } }
Příklad 22
76
Radiová tlačítka (radio buttons) jsou variantou zatrhávacích políček, kdy několik
zatrhávacích políček je seskupeno a jakmile je jedno tlačítko stlačeno, ostatní jsou
automaticky vypnuta. Seskupeni radiových tlacitek je možno vytvořit:
public class RadioTlacitka extends Applet { CheckBoxGroup radio; public void init() { radiotlacitka = new CheckBoxGroup(); add (new Checkbox("Pondeli",radio,true)); add (new Checkbox("Utery",radio,false)); add (new Checkbox("streda",radio,false)); } }
Příklad 23
Z dalších grafických objektu Java nabízí návěstí (label), listy (s jednoduchým nebo
mnohonásobným výběrem), textová pole, textové oblasti a "rolovací tlačítka".
77
7.6. Pokročilé prvky grafického rozhráni
V této kapitole se dozvíte: o pokročilejších metodách tvorby grafických rozhraní. Také se naučíte způsobu, jakým vytvoříte animace na webovské stránce. Ukážeme si možnosti třídy Graphics, s jejíž pomocí vytváříme grafické objekty. Doba potřebná k prostudování této kapitoly: 45 minut
Výše uvedená tlačítka a zpracování generovaných události jsou pouze základními
stavebními prvky pro tvorbu grafického rozhraní v jazyce Java. Je nutno vyzdvihnout
skutečnost, ze grafické programy či applety implementované v Javě budou pracovat a
vypadat stejně (nebo velmi podobné) na různých typech počítačů. Toto je velkým přínosem
Javy, který jistě ocení všichni, kdo se zabývají grafickým programováním v prostředí X-
Windows. Takto získají nejen relativně jednoduše vytvořené grafické rozhraní pro svůj typ
operačního systému, ale zároveň i okamžitou přenositelnost do MS Windows a Apple
MacIntosh.
Správci rozložení (Layout Managers) umožňují kontrolu rozložení jednotlivých
grafických komponentu na panelu. Java má několik typu těchto správců. Nejjednodušším z
nich je tzv. FlowLayout Manager, který je vždy přítomen implicitně, pokud není použit
jiný správce. Tento správce umisťuje grafické objekty na obrazovku vedle sebe. Dalším je
tzv. BorderLayout Manager, který umožňuje daleko komplexnější rozložení objektu na
obrazovce, neboť si rozděluje panel na pět oblasti - severní, jižní, zapadni, východní a
střední.
Nejpokročilejší ze správců rozložení je tzv. GridLayout Manager, který umožňuje
rozdělení panelu na řádky a sloupce a tím umožňuje prakticky libovolné umístění
grafických objektu na daném panelu.
78
7.6.1. Grafické objekty a animace
Grafické objekty třídy java.awt.Graphics mají celou řadu metod jak k
zobrazováni textu, tak i grafických images, například:
drawString(string s, x, y)
drawChars(char data[], ofset, delka, x, y)
drawBytes(byte data[], ofset, delka, x, y)
drawLine (x1, y1, x2, y1)
drawRect(x, y, sirka, vyska)
fillRect(x, y, sirka, vyska)
clearRect(x, y, sirka, vyska)
drawOval(x, y, sirka, vyska)
fillOval(x, y, sirka, vyska)
drawImage(Image im, ImageObserver observer)
Doporučují nejen prostudování popisu třídy java.awt.Graphics, ale také
vyzkoušení, co přesně, která metoda dělá, ačkoliv je to již často zřejmě z názvu metody.
Zajímavá je zejména metoda drawImage, která vyžaduje jako parametr objekt Image
a objekt ImageObserver. Grafický image je možno do programu zavést pomocí metody
getImage ze třídy java.applet.Applet, která se zpravidla spouští během metody init(),
jak také ukazuje následující příklad:
public void init() { im = getImage(getDocumentBase(),"obrazek.gif"); }
Tuto grafickou image pošleme na obrazovku pomoci metody drawImage
public void paint(Graphics g) { g.drawImage(im, 25, 25, this); }
79
Jednoduchou animaci lze provést načtením několika grafických souboru do
grafického pole a pak je postupné posílat na obrazovku. Načtení je možno provést tímto
způsobem: Image pole[] = new Image [3]; pole[0] = getImage(getDocumentBase(),"obrazek0.gif"); pole[1] = getImage(getDocumentBase(),"obrazek1.gif"); pole[2] = getImage(getDocumentBase(),"obrazek2.gif");
Animaci pak spustíme import java.awt.Graphics; import java.applet.Applet; public class Animace extends Applet { private i = 0; Image pole[] = new Image [3]; public void init() { pole[0] = getImage(getDocumentBase(),"obrazek0.gif"); pole[1] = getImage(getDocumentBase(),"obrazek1.gif"); pole[2] = getImage(getDocumentBase(),"obrazek2.gif"); } public void paint (Graphics g); { g.drawImage(pole[i], 50, 50, this); i++; if (i > 2) { i = 0; } } }
Příklad 24
Obr.15
80
Pokud si zkusíte naprogramovat takovou jednoduchou animaci, pravděpodobně
zjistíte, že sice animace nastala, ale dochází k rušivému bliknuti při každé výměně obrázku.
Je to způsobeno tím, že metoda update(), která má na starosti výstup každého nového
obrázku nejprve vyčistí obrazovku voláním metody clear(). Proto je toto blikání možné
odstranit redefinováním metody update(). Tak metoda clear() v ní není spouštěná: void public update (Graphics g) { repaint(); }
81
7.7. Třída MediaTracker
V této kapitole se dozvíte: o možnostech třídy MediaTracker. Povíme si o metodách tvorby kvalitních webovských animací. Povíme si o metodě, kterou odstraníme nepříjemné poblikávání stránky, při spuštění animace. Doba potřebná k prostudování této kapitoly: 45 minut
Třídu MediaTracker lze nalézt v knihovně java.awt, a je výhodné ji používat k
animacím, neboť poskytuje několik metod k monitorování objektu a definovatelných skupin
objektu. Kombinaci třídy MediaTracker a dvojitého bafrování lze vytvářet velmi plynulé
animace. Mezi nejzajímavější metody teto třídy patří: void addImage (Image image, int groupid) ktera zaregistruje danou image s prislusnym identifikatorem skupiny (grafickych) objektu. boolean checkID(int groupid) ktera kontroluje, zda vsechny image s danym identifikatorem skupiny jsou naloadovany (pak vraci hodnotu true), pokud nektere image chybi vraci hodnotu false, ale nezajistuje jejich dodatecne zavedeni boolean checkID(int groupid, boolean load) funguje podobne jako predchozi metoda, pouze zajisti automaticke zavedeni chybejicich imagi, pokud je hodnota parametru load nastavena true boolean checkAll (boolean load) kontroluje vsechny image bez rozdilu oznaceni skupinoveho identifikatoru. Zajistuje automaticke zavedeni chybejicich imagi v pripade, ze hodnota parametru load je nastavena true void waitForID(int id) ceka na zavedeni imagi daneho identifikatoru skupiny void waitForAll() ceka na zavedeni vsech imagi bez rozdilu jejich identifikatoru skupiny.
Co se týče implementace dvojího bafrování v Javě, je třeba si nejprve uvědomit
pojem grafického kontextu.
82
Graficky kontext je datová struktura, kterou systém umí používat jako kreslící
plochu. Například při deklaraci metody paint(): public void paint (Graphics g) {
je objekt g grafickým kontextem. Jakýkoliv vystup je možné provést použitím
tohoto kontextu: g.drawLine(1, 1, 50, 50);
Jazyk Java pak to, co bylo nakresleno do datové struktury g (tj. grafického kontextu)
převede na obrazovku.
Samotný princip dvojího bafrování spočívá ve vytvoření grafického kontextu, který
však není okamžitě převeden na obrazovku, tak jako je tomu v následujícím příkladu:
import java.applet.Applet; import java.awt.*; public class Priklad extends Applet { Image dvojitybafr; Graphics grafika; public void init { // nastaveni rozmeru bafru dvojitybafr = createImage(200,200); grafika = dvojitybafr.getGraphics(); // nastaveni pracovni kreslici plochy grafika.setColor(Color.white); grafika.fillRect(0, 0, 200, 200); grafika.setColor(Color.black); }
Příklad 25
Nyní je možno použít grafického kontextu grafika pro jakýkoliv graficky výstup.
Image však budou existovat pouze v objektu dvojitybafr. Obsah tohoto objektu je možné
zobrazit na obrazovce pomoci metody paint takto public void paint(Graphics g) { g.drawImage(dvojitybafr, 0, 0, this); }
83
7.8. Zvukové přehrávky
V této kapitole se dozvíte: o možnostech zpracování zvuku v jazyce JAVA. Dovíte se o možnostech, které JAVA poskytuje v oblasti audio přehrávek na webovských stránkách. Doba potřebná k prostudování této kapitoly: 45 minut
Jazyk Java má metody k přehrávání zvukových souboru ve standardní formátu firmy
Sun Microsystems označován jako au. Tyto metody je možné nalézt ve třídě
java.applet.AudioClip. Software zabudovaný do interpretu Javy zajisti vlastní
přehrávku na zvukové kartě počítače na němž je applet spuštěn.
Nejjednodušším způsobem jak přehrát zvukový soubor je prostřednictvím metody play.
play(getDocumentBase(),"zvuk.au"); Následující jednoduchý applet zobrazí krátkou zprávu a přehraje zvukový soubor import java.awt.Graphics; import java.applet.Applet; public class ZvukovyAplet extends Applet { public void paint(Graphics g) { g.drawString("Poslouchejte nasledujici prehravku", 10, 10); play(getDocumentBase(), "zvuk.au"); } }
Příklad 26
Na první pohled je nápadná podobnost přehrávání zvukových souboru s výstupem
grafických imagi. Proto je též možné nejprve zvukový soubor naloadovat (tj. uschovat v
operační paměti) a přehrát až někdy později. Tohoto lze docílit například takto
AudioClip zvuk; zvuk = getAudioClip(getDocumentBase(),"zvuk.au");
Jakmile je zvuková nahrávka přístupná v objektu zvuk, pak je možné použít metody
play, loop a stop k jejímu ovládání. Metoda play spouští přehrávku zvukového záznamu,
který je dostupný v daném objektu. zvuk.play();
84
Metoda loop pracuje podobně jako play, pouze neustále přehrává daný zvukový
záznam dokola. zvuk.loop();
Jakmile použijete metody loop, budeme potřebovat danou přehrávku zastavit. Java
má k dispozici metodu stop, určenou přesně k tomuto účelu zvuk.stop();
Kompletní krátký applet k přehrávání zvukového souboru ve formě zastavitelné
zvukové smyčky pak může vypadat následujícím způsobem.
import java.awt.Graphics; import java.applet.*; public class ZvukovyAplet extends Applet { AudioClip zvuk; public void init() { zvuk = getAudioClip(getDocumentBase(),"zvuk.au"); } public void paint(Graphics g) { g.drawString("Poslouchejte nasledujici prehravku", 10,10); } public void start() { zvuk.loop(); } public void stop() { zvuk.stop(); } }
Příklad 27
85
8. Test č.2
V této kapitole se dozvíte: Jakým způsobem budete zpracovávat test pro ukončení kurzu XJAV1. Doba potřebná k prostudování této kapitoly: 5 minut Doba potřebná k vypracování testu: 90 minut
Zakončením tohoto kurzu je test, ve kterém by jste měli potvrdit své vědomosti. Pro
jeho úspěšné vykonání musíte vyřešit alespoň polovinu zadaného příkladu.
Test spustíte kliknutím na obrázek . Jako jméno zadejte své příjmení, jako heslo vaše příjmení+2002.
86
TEST č.2 - XJAV1 - OOP pro Internet a Intranet
Používáte prohlížeč Microsoft Internet Explorer 4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Pro správné zobrazení češtiny použijte kódování: Středoevropské jazyky Windows
Jadro: Win32 Rozlišení: 1024 x 768 Barevná hloubka: 16 bit Java povolena ?: ANO
Anti-aliasing ?: NE
Uživatelské jméno: Heslo:
Úkol
Vytvořte applet, který načte několik obrázku a rozpohybuje je.
Obrázek umístěte doprostřed stránky a přidejte k němu odkaz na libovolnou
internetovou stránku. Při kliknutí na odkaz se přehraje zvukový záznam a
provede se přesměrování.
Program popište a zajistěte odstranění rušivého přeblikávání.
Zdrojovy kod zadaneho appletu
Doporučení
Na toto místo napište své jméno a emailovou adresu
Jmeno PrijmeniEmail
Potvrdit-Odeslat Smazat-Znovu
87
9. Seznam použité a doporučené literatury
[1] S. Davis, Visual J++, 1998, GRADA [2] P. J. Perry, Tvorba dokonalých WWW stránek, Praha, Grada, 1996 [3] P. Herout, Grafické uživatelské…, České Budějovice : Kopp, 2001 [4] M. Grand, Referenční příručka jazyka, Praha, Computer Press, 1998 [5] D. Štrupl, Java pro každého : programování pro Internet, Praha, Plus, 1997 [6] M. Virius, Java pro zelenáče, Praha, Neokortex, 2001 [7] T. Pitner, Začínáme programovat…, Praha, Grada Publishing, 2002
88