OSTRAVSKÁ UNIVERZITA PŘÍRODOVĚDNÁ FAKULTA
XJAV1 – OOP PRO INTERNET A INTRANET
ING. DAVID BRAŽINA
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 aplikací a appletů . Poznáte strukturu programovacího jazyka JAVA a seznámíte se z jeho syntaxí.
Získáte: •
dovednosti ve tvorb ě dynamických internetových stránek. Získáte praktické zkušenosti s tvorbou interaktivních appletů , budete umět spojit vlastnosti aplikace a appletu v rámci složitějších programových struktur.
Budete schopni: •
Zpracovávat události myši a klávesnice a zároveň s těmito událostmi pracovat. Budete schopni vytvo řit interaktivní aplikace v rámci webovských stránek. Nau číte se pracovat s editorem 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 VÝHODY A NEVÝHODY JAVY ................................................................................... 7 2.1.1. Vlastnosti Javy ................................................................................................ 9 2.2. APLIKACE A APPLETY ............................................................................................ 11 2.1.
3.
JAVASCRIPT ............................................................................................................. 14
4.
VÝVOJOVÉ PROSTŘEDÍ JAVY - APLIKACE.................................................... 16 4.1.
5.
PLATFORMA JAVY .................................................................................................. 19
OBJEKTOVÉ PROGRAMOVÁNÍ JAVY............................................................... 20 PSANÍ PROGRAMU .................................................................................................. 21 ZÁKLADNÍ SCHÉMA PROGRAMU ............................................................................. 24 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 5.1. 5.2. 5.3.
6.
TEST Č.1 ..................................................................................................................... 52
7.
VÝVOJOVÉ PROSTŘEDÍ JAVY - APPLETY ...................................................... 56 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 7.1.
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
[email protected]
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
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čí napsat program v jakémkoliv programovacím jazyce a uložit jako spustitelný soubor v rámci HTML. Pokud by šlo pouze o sepsání a spuštění programu zdá se tento nápad vynikající. Problémy ale nastanou v případě, pokud se má takto upravená stránka opravdu umístit na web a spouštět se z něj. Každý takový program bude vyžadovat podporu knihoven, které budou komunikovat s www stránkami. Tyto knihovny se budou navzájem lišit a tak bude třeba další 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í načítání do paměti příjemcova počítače. I natažení velmi malého objemu dat po sítí, může trvat dlouhou dobu. Poruchy na cestě způsobí, že některé data se budou muset poslat vícekrát. Výhodou Javy v tomto směru je, že programy, které v Javě vznikají jsou nepomě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 zaruč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 systé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í
stejné
do
rodiny
pravidla.
objektově
Výhodou
je
orientovaných
jazyků.
zde
větší
zejména
Platí
pro
ní
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
souborů. Zároveň se stará o bezpečný přístup k síti.
10
na
stav
lokálních
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“]
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
Applet Funguje mi tento applet?
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.
javascript <script language="JavaScript"> 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)
Vytvoření appletů
Spuštění souboru .class interpretem java.exe
Obr.3
16
Appletviewer .exe
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
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 se tedy na to jak toho dosahuje. Zdrojový kód programovacích jazyků (Pascal, C, C++) se př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 hardwarový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í program. Místo generování spustitelného souboru s instrukcemi pro procesor 80x86 překladač Javy vyrobí to čemu se říká Java bytecode. Pokud tento program chcete spustit potřebujete k tomu Javovský virtuální stroj na jaké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ší takzvaná just-in-kompilace. Pokud je tato metoda povolena, zkonvertuje se bajtový kód na 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”);
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”
Obr.8
24
5.3.
Práce s objekty
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 New = String (“slovo”) vytvoří se objekt třídy String a inicializuje ho konstruktorem
s parametrem "slovo". A k čemu to je dobré? String retezec = new String("ahoj");
// vytvoření objektu
retezec = 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 Jak bude vypadat výsledný řetězec? Pokud budu chtít tento objekt zrušit musím tomuto objektu přiradit proměnnou null Retezec=null;
Kdy se objekt odstraní automaticky? Java neumožňuje přímou prácí s pamětí. Voláním new vyvolám nový objekt, který používám tak dlouho dokud jej potřebuji. O uvolnění paměti se stará proces, který je označován jako garbage colection. V případě že zaniknout všechny odkazy na daný objekt, 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
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ňovat kaž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
musí být obsaženy ve třídách. Každá třída musí být potomkem kořenové třídy Object, takže se vytváří jen jediná stromová struktura. Object je v Javě jediná třída, která nemá předka. Aby se nám to nepletlo můžeme říct, že koupaliště je třída. Termální koupaliště v Červené Lhotě pak je objektem..
Object
Třída 1
Třída 3
Třída 2
Třída 4
Třída 5
Obr.9
27
Třída 6
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 { int i;
// mam class trida1 ve kterém definuji proměnnou 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
Podívejte se na následující program a ověřte jeho funkčnost import java.io.*; public class FileIO { public static void main(String[] args) { try { // použije normální vstupní proud FileInputStream in = new FileInputStream(args[0]); BufferedInputStream bin = new BufferedInputStream(in); // vytvoří výstupní proud s vyrovnávací pamětí FileOutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); PrintStream pout = new PrintStream(bout); // čte osm znaků najednou byte bArray[] = new byte[8]; int nBytesRead; while(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
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 komunikačních linek mezi procesy charakterizované IP adresou a portem. Sockety nejsou specifickou záležitosti Javy, ale jsou všeobecným základem síťového programování pro TCP/IP. V jazyce Java lze TCP/IP spojení navázat za použití knihovny třídy java.net a to jak 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;
// sckt = new Socket("javaserv",8888); // // instr = sckt.getInputStream(); // // while ((c = instr.read()) != -1 { // // System.out.println((char)c); // } sckt.close(); //
klientsky program otevre spojeni s pocitacem javaserv, na portu 8888 ziska identifikaci socketoveho souboru cte jeden byte prichazejici ze serveru tiskne prijaty byte na vystup 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éto kapitole se dozvíte: Jakým způsobem budete zpracovávat test pro ukončení první poloviny semestru. 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é vě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. Test najede kliknutím na obrázek . Jako jméno zadejte své příjmení, jako heslo vaše jméno+2002. TEST
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 Prijmeni Email
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
V této kapitole se dozvíte: čeho se vyvarovat při tvorbě webovské stránky, naučíte se pracovat s 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ž půjde hladce. Od této chvíle se budeme věnovat vlastní práci s dynamickými možnostmi Javy. 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 rozmístění slov rozhodne o tom jestli vůbec budeme čekat na to, až se stránka načte celá. První 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 a bůhví čím ještě, se jednak bude pomalu načítat, a jednak naštve případného návštěvníka, protož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 HTML stránky. Doba potřebná k prostudování této kapitoly: 45 minut Nejjednodušší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í XWindows. 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[] pole[0] pole[1] pole[2]
= = = =
new Image [3]; getImage(getDocumentBase(),"obrazek0.gif"); getImage(getDocumentBase(),"obrazek1.gif"); 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 Prijmeni Email
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