OOPR_07 1
Obsah přednášky Balíčky (package) z pohledu UML Balíčky v Javě a příkaz import JAR soubory a samostatná aplikace Ladění programů debugger Jednoduché programy s grafikou 2
Package balíček z pohledu UML Balíček je abstrakce sdružování je to kontejner a vlastník modelovaných elementů. Každý balíček má vlastní jmenný prostor namespace uvnitř něhož musí být všechny názvy jedinečné. né. Většinou se jedná o názvy tříd a podtříd. Balíček je univerzálním mechanismem uspořádání elementů do skupin. 3
Package balíček z pohledu UML Pomocí mechanismu balíčků lze realizovat následující úkoly: Seskupovat sémanticky (významově) související prvky (třídy) Definovat sémantické hranice uvnitř modelu. Vytvářet jednotky správy konfigurace. V etapě návrhu poskytují balíčky jednotky pro souběžnou práci. Balíčky poskytují zapouzdřený jmenný prostor, v němž musí být všechny názvy jedinečné. 4
Grafická reprezentace balíčku v UML Balíčky vytvářejí hranice, jež ohraničují prostor, v němž musí být všechny názvy jedinečné. Jmenné prostory vytvářejí důležitý sémantický rozdíl mezi závislostmi typu <<import>> a <<access>>. Oba uvedené stereotypy umožňují klientským prvkům přístup k exportovaným prvkům dodavatelského balíčku, liší se však sémantikou. <<access>> <<import>> Balíček1 Balíček2 Balíček3 5
Stereotyp v UML Stereotyp zastupuje určitou variantu existujícího prvku v datovém modelu, který má sice stejnou podobu (atributy a relace), ale používá se s jiným záměrem. Stereotyp umožňuje uje vytvářet nové prvky modelu založené na existujících prvcích. Název stereotypu se ukládá do dvojitých závorek << >> a připojuje k novému prvku. 6
Závislost balíčků Balíčky mohou být vytvářeny v hierarchii, podobně jako adresáře souborů. Veřejným prvkům (public) balíčku říkáme exportované prvky (mohou být používány prvky jiných balíčků). Soukromé prvky (private) balíčků nemohou být používány prvky jiných balíčků. 7
Package balíček z pohledu UML stereotyp <<import>> Závislost stereotypu <<import>> znamená, že jmenný prostor dodavatele je sloučen se jmenným prostorem klienta. Znamená to, že klientské prvky se mohou na dodavatelské (knihovní) prvky odkazovat pouze názvem cílového prvku, nemusí uvádět cestu k němu. Závislost stereotypu <<import>> je nejčastěji používaným typem závislosti navzdory tomu, že může vést ke kolizím kvůli nezamýšlené duplicitě názvů. 8
Package balíček z pohledu UML stereotyp <<access>> Závislost typu <<access>> znamená, že prvky klientského balíčku mohou přistupovat k veřejným prvkům dodavatelského balíčku, aniž by přitom došlo ke sloučení jmenných prostorů. Klientské prvky mohou používat dodavatelské prvky, musí však použít také cestu k danému prvku. 9
Balíčky v Javě Balíčkem se nazývá to, co můžeme získat, použitím klíčového slova import k importu celé knihovny např.: import java.util.*; příkaz připojuje k projektu celou knihovnu nástrojů balíčku java, podbalíčku util při vytváření vlastního balíčku musí být v daném souboru první příkaz package s názvem balíčku např.: package balicek1; 10
Balíčky uživatelský pohled Java umožňuje sdružovat skupiny tříd do hierarchicky uspořádaných balíčků (packages). Konvence: zdrojové soubory tříd patřících do společného balíčku se ukládají do stejného adresáře (stejné složky) Překladač uspořádá stejným způsobem i přeložené soubory Zdrojové a přeložené soubory nemusí být ve stejné složce (BlueJ umisťuje zdrojové soubory *.java i přeložené soubory *.class do stejné složky) 11
Balíčky označování (notace) Názvy hierarchických balíčků jsou odděleny. (tečkou) např. import java.util.date; import příkaz pro začlenění balíčku do aplikace, před tímto příkazem může být pouze příkaz package (viz dále) java balíček s názvem java util podbalíček balíčku java Calendar název importované třídy deklarace objektů s příkazem import: Calendar dnes; // pouze kvalifikace, bez konstruktoru 12
Balíčky označování (notace) deklarace objektů bez příkazu import: java.util.calendar dnes; balíčky jsou užitečné pro seskupování (agregaci) příbuzných tříd 13
Balíčky význam pomáhají odstranit konflikt jmen (názvů tříd) tím, že jméno třídy je jako přípona k názvům balíčků, které jsou první např. plné jméno třídy Calendar je: java.util.calendar např. java.awt (Abstract Window Toolkid) obsahuje třídu List a java.util má rozhraní List class Priklad { java.awt.list list1; // List gui java.util.list list2; // abstraktní List namespace prostor jmen (používají jiné systémy) 14
Balíčky - vytvoření Třída patřící do daného balíčku musí začínat příkazem: package název_balíčku; název_balíčku musí být stejný jako název složky (podadresáře) e) v níž je soubor umístěn názvy balíčků: písmena, číslice a znaky _ a $ nesmějí být shodné s klíčovým slovem, nesmějí začínat číslicí podle konvence pouze malá písmena nabídka Edit \ New package při deklaraci se balíčky vnořují do sebe 15
package cviceni; Poznámky public class Prepravka { public int extrem; public int index; public Prepravka() { extrem=0; index = 0; } public Prepravka(int extrem, int index) { this.extrem = extrem; this.index = index; } public void setprepravka(int prvni, int druhy) { extrem = prvni; index = druhy; } public String tostring() { return String.format("%s: %d\n%s: %d","extrem",extrem,"index",index); } public int getextrem() { return extrem; } } public int getindex() { return index; } 16
package cviceni; public class Register { private int pole[]; private int top; // konstruktor public Register(int pocet) { pole = new int[pocet]; top = -1; } } Poznámky Třída Register, Třída RegisterTestP import cviceni.register; import cviceni.prepravka;// import cviceni.* public class RegisterTestP { public static void main(string args[]) { Register a = new Register(5); a.vlozit(10); a.vlozit(15); a.vlozit(-44); a.tisk(); a.odstranit(15); a.tisk(); Prepravka p; p = a.minimum(); System.out.println("Minimalni prvek registru: " + p); } } System.out.println("getPrvek 15"); int b= a.getprvek(15); 17
18
package prvni.druhy.ctvrty.paty; Poznámky import javax.swing.joptionpane; // Class static pomocna trida slouzici jako schranka pro staticke metody public class Cs { } package prvni.druhy.ctvrty; import prvni.druhy.ctvrty.paty.cs; import prvni.druhy.ctvrty.paty.pom; public class Citac { } package prvni.druhy; // java první.druhy.citactest //package druhy; import prvni.druhy.ctvrty.citac; public class CitacTest { } import prvni.druhy.ctvrty.citac; // java CitacTest public class CitacTest { } 19
Konvence pojmenování balíčků Problém tvoření jedinečných jmen balíčků ať se nacházejí kdekoli. Použití internetových jmen domén za tímto účelem, protože ta garantují, že budou jedinečná ná a proto nikdy nenastane kolize. Internetová jména domén se používají v obráceném pořadí např. www.bruceeckel.com com.bruceeckel... cz.osu.... //a název skutečných balíčků 20
Proměnná prostředí CLASSPATH Javovský interpret (java OsobaTest) postupuje následovně: nejdříve vyhledá proměnnou CLASSPATH, která obsahuje jeden nebo více adresářů, které jsou použity jako kořenové adresáře pro vyhledávání.class souborů. interpret začne v uvedeném kořenovém adresáři a vezme jméno balíčku a nahradí tečky \ např. balíček foo.bar.baz bude převeden na: foo\bar\baz (v Unixu / ) 21
22
package com.bruceeckel.simple; //cz.osu.simple; Poznámky public class Vector { public Vector() { System.out.println("com.bruceeckel.simple.Vector"); } } package com.bruceeckel.simple; //cz.osu.simple; public class List { public List() { System.out.println("com.bruceeckel.simple.List"); } } 23
Konflikty názvů import dvou knihoven, které obě používají název Vector import com.bruceeckel.simple.*; import java.util.*; konflikt: Vector v = new Vector(); musíme tedy použít celý název a napsat buď: java.util.vector v = new java.util.vector(); nebo com.bruceeckel.simple.vector v = new com.bruceeckel.simple.vector(); 24
Proměná prostředí CLASSPATH Pokud jsou soubory uloženy v uvedených podadresářích: C:\doc\JavaT\com\bruceeckel\simple CLASSPATH=.;C:\doc\JavaT Pro JAR soubory platí odlišnost, a to že je třeba uvést také i jméno JAR souboru, ne pouze cestu! CLASSPATH=.;d:\data\mujJAR.jar od verze Java 2 je možné program překládat a spouštět bez nastavené proměnné prostředí CLASSPATH 25
Javovské API pakety - balíčky Application Programming Interface Java obsahuje mnoho předdefinovaných tříd, které jsou seskupeny do tzv. balíčků, paketů (packages) deklarace import specifikuje, že program např. používá třídu Scanner z paketu (balíčku) java.utils import java.util.scanner; přehled předdefinovaných balíčků (paketů) je uveden v následující tabulce 26
Javovské API pakety (balíčky) Paket - balíček java.applet java.awt java.awt.eve nt Popis funkcí Balíček obsahuje několik rozhraní požadovaných Javovskými aplety. Aplet je program schopný běžet ve webovském prohlížeči. Java Abstract Window Toolkid Package obsahuje třídy a rozhraní nutné pro práci v grafickém uživatelském rozhraní Javy (GUI) Ve stávající verzi Javy se spíše využívá javax.swing balíček Java Abstract Window Toolkid Event Package obsahuje třídy a rozhraní, které umožňují zpracování událostí pro komponenty GUI patřící pod java.awt 27
Javovské API pakety (balíčky) Paket - balíček java.io java.lang java.net Popis funkcí Java Input Output Package obsahuje třídy a rozhraní, které programy používají pro vstupně výstupní operace Java Language Package obsahuje základní třídy a rozhraní potřebné pro tvorbu javovské aplikace. Tento balíček je importován překladačem implicitně. Java Networking Package obsahuje třídy a rozhraní, které umožní programům komunikovat přes síť počítačů 28
Javovské API pakety (balíčky) Paket - balíček java.text java.util Popis funkcí Java Text Package obsahuje třídy a rozhraní, které umožňují aplikacím manipulovat s čísly, datumy a znaky jako s řetězci. Umožňuje lokalizaci programů specifické nastavení Java Utilities Package obsahuje pomocné třídy a rozhraní, které umožňují: manipulace s časem a datumem práce s náhodnými čísly ukládání a zpracování rozsáhlých dat rozdělení řetězců na menší části - token 29
Javovské API pakety (balíčky) Paket - balíček Popis funkcí javax.swing Java Swing GUI Components Package - obsahuje třídy a rozhraní, které podporují portovatelné (portable) GUI. javax.swing.eve nt Java Swing Event Package obsahuje třídy a rozhraní, které umožňují zpracování událostí pro GUI komponentu balíčku java.swing 30
Balíčky problémy (námitky) při vytvoření nového balíčku určuje jeho název implicitně také adresářovou strukturu balíček musí existovat ve složce určené názvem složka musí existovat na místě, aby jí bylo možné nají na základě hodnoty uložené v proměnné CLASSPATH 31
Java Archives Files JAR Files JAR formát je zip formát použitý na skupinu souborů, jenž je spakovaná do jednoho.jar souboru. JAR soubory jsou nezávislé na platformě stejně jako Java. JAR soubory jsou zejména výhodné při stahování z webu, protože stáhneme jeden, v němž jsou ostatní soubory spakovány. Soubor ve formátu.jar je jeden soubor obsahující kolekci zazipovaných souborů spolu se souborem manifest, který je popisuje. 32
Java Archives Files JAR Files explicitní vyvolání utility jar jar [volby] destination [manifest] inputfile(s) volby jsou skupiny písmen jejich význam je v následující tabulce 33
Význam voleb v utilitě jar Volba c t x x file f m Význam Vytváří nový, nebo prázdný archiv (v případě použití jména existujícího archivu) Vrátí tabulku obsahu Extrahuje všechny zazipované soubory Extrahuje pouze uvedený soubor specifikace souboru není-li uvedeno předpoklad stand. vstup, nebo stand. výstup (konzola) Říká, že první argument bude jméno uživatelem vytvořeného souboru manifest v Vytváří komentovaný výstup, popisující co děla jar soubor (upovídaná varianta) 0 Pouze ukládá soubory, neprovádí kompresi. Využití pro uložení souborů do classpath. Rychlejší přístup nula. M Nevytváří automaticky soubor manifest. 34
Základní operace se souborem JAR Operace Vytvoření JAR souboru Příkaz jar cf jar-file input-file(s) Prohlédnutí obsahu JAR souboru Extrahování obsahu JAR souboru Extrahování specifikovaných souborů z JAR souboru Spuštění aplikace spakované jako JAR soubor jar tf jar-file jar xf jar-file jar xf jar-file archived-file(s) java jar app.jar 35
Práce s JAR soubory Pokud soubory, které se mají uložit do JAR souboru obsahují podadresáře, jsou tyto podadresáře automaticky přidány do JAR souboru, spolu s informací o cestě Typický příklad: jar cf mujjarfile.jar *.class příkaz vytvoří JAR soubor mujjarfile, který obsahuje všechny.class soubory spolu se souborem manifest 36
Práce s JAR soubory Podobně jako předchozí příklad, ale s uživatelsky vytvořeným souborem mujmanifestfile.mf jar cmf myjarfile.jar mymanifestfile.mf *.class Vytvoří tabulku obsahu souboru mujjarfile.jar jar tf myjarfile.jar 37
Práce s JAR soubory Přidá příznak komentáře (více informací) o zkomprimovaných souborech jar tvf mujjarfile.jar Pokud vytvoříme JAR soubor s volbou 0 (nula), tento JAR soubor bude přidán do classpath Při poklepání na.jar soubor by se tento měl spustit (pokud jsou nastaveny správně příznaky) ke spuštění.jar souboru se používá pouze jre místo jdk 38
Příklad TicTacToe TicTacToe.class audio images jar cvf TicTacToe.jar TicTacToe.class audio images jeden soubor a dva kompletní podadresáře, v adresáři TicTacToe 39
Prohlížení obsahu JAR souboru jar tf TicTacToe.jar META-INF/MANIFEST.MF TicTacToe.class 40
Extrahování obsahu JAR souboru jar xf TicTacToe.jar TicTacToe.class images/cross.gif extrahujeme pouze dva soubory, a to TicTacToe.class a cross.gif z adresáře images jar xf TicTacToe.jar extrahujeme všechny soubory 41
java jar app.jar Spuštění aplikace 42
Ladění programů - debugger ladění programů možnosti: vlastní výpis lokálních proměnných použití ladícího programu 1. nastavení zarážek (breakpointů) a v místech zastavení programu (možnost prohlížení obsahu všech proměnných, výhodný funkce inspect ) 2. zatrhnout záložku View \ Show debugger 3. spustit v BlueJ metodu main v bodě přerušení debugger, kde se prohlíží proměnné, krokuje program 43
Poznámky Nastavení bodů přerušení breatpoints Tool Set/ClearBreakpoint Ctrl B 44
Poznámky View Show debugger 45
Význam tlačítek Halt slouží k zastavení běžícího programu (zacyklený program) Step krokování, necháte program provést příkaz na který ve zdrojovém textu ukazuje šipka Step Into krokovat dovnitř, podobná funkce jako Step, při provádění metody se zavolá pouze první příkaz metody a pokračuje se v metodě Continue program pokračuje v běhu až do příští zarážky (breakpointu) Terminate ukončení programu 46
Poznámky Inspekce objektů 47
Jednoduché použití grafiky orientace osy x a y a jejich rozsah daný nastavením v zobrazitelných bodech (800x 600, 1280x1024) Třída Graphics z balíčku java.awt poskytuje různé metody pro zobrazení textu a různých tvarů Třída JPanel z balíčku javax.swing poskytuje prostor pro kreslení 48
package graf1; import java.awt.graphics; import javax.swing.jpanel; public class DrawPanel extends JPanel{ public void paintcomponent(graphics g){ super.paintcomponent(g); int sirka = getwidth(); //ziska sirku panelu int vyska = getheight(); //ziska vysku panelu Poznámky Třída vytváří skutečné kreslení DrawPanel je podtřídou třídy JPanel //kresli dve cary z rohu do rohu g.drawline(0, 0, sirka, vyska); g.drawline(0, vyska, sirka, 0); // kresli obdelnik g.drawrect(12, 15, sirka-20, vyska-30); } } 49
Třída DrawPanel Každý třída JPanel, tedy i DrawPanel má metodu paintcomponent, kterou systém automaticky volá vždy, když potřebuje zobrazit JPanel jedná se o případy prvního zobrazení, zobrazení po překrytí, zobrazení po změně velikosti metoda má jeden argument typu Graphics který dostaneme od systému, když tuto metodu vyvoláme call back. 50
Třída DrawPanel prvním příkazem v každé metodě paintcomponent musí být volání předka, tedy: super.paintcomponent(g); 51
package graf1; import javax.swing.jframe; public class DrawPanelTest { public static void main(string[] args) { Poznámky Třída vytvoří okno pro zobrazení kreslení // vytvori panel do ktereho se kresli DrawPanel panel = new DrawPanel(); //vytvori novy frame, ktery sestava z panelu JFrame aplikace = new JFrame(); // nastavi frame - ramec na exit, kdyz je uzavreny aplikace.setdefaultcloseoperation(jframe.exit_on_close); aplikace.add(panel); //prida panel do framu aplikace.setsize(250,250); //nastavi velikost framu aplikace.setvisible(true); //ucini frame viditelnym } } 52
Třída DrawPanelTest K zobrazení DrawPanel na obrazovku, potřebujeme window (okno) to vytvoříme pomocí třídy JFrame aplikace.setdefaultcloseoperation(jframe.exit_on_close); způsobí, že aplikace bude ukončena, když uživatel zavře okno aplikace.add(panel); připojí DrawPanel s našim kreslením k JFrame 53
Poznámky 54
Poznámky 55
Grafika - barvy a vyplněné tvary public Color(int r, int g, int b); předdefinované barvy: Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW 56
Grafika - barvy a vyplněné tvary metody fillrect, filloval podobné jako drawrect a drawoval: první dva parametry x a y souřadnice levého horního rohu třetí parametr šířka obrazce čtvrtý parametr délka obrazce 57
import java.awt.color; import java.awt.graphics; import javax.swing.jpanel; Poznámky public class DrawSmiley extends JPanel { public void paintcomponent( Graphics g ) { super.paintcomponent( g ); // draw the face g.setcolor( Color.YELLOW ); g.filloval( 10, 10, 200, 200 ); // draw the eyes g.setcolor( Color.BLACK ); g.filloval( 55, 65, 30, 30 ); g.filloval( 135, 65, 30, 30 ); // draw the mouth g.filloval( 50, 110, 120, 60 ); // "touch up" the mouth into a smile g.setcolor( Color.YELLOW ); // první obrazek g.fillrect( 50, 110, 120, 30 ); // tyto tri radky g.filloval( 50, 120, 120, 40 ); // jsou komentar } // end method paintcomponent } // end class DrawSmiley 58
import javax.swing.jframe; Poznámky public class DrawSmileyTest { public static void main( String args[] ) { DrawSmiley panel = new DrawSmiley(); JFrame application = new JFrame(); } application.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); application.add( panel ); application.setsize( 230, 250 ); application.setvisible( true ); } // end main 59