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é. – 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 <
> a <>. • 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.
<> 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 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 <> • Závislost stereotypu <> 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 <> 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 <> • Závislost typu <> 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) 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\ %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(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; //package druhy;
// java první.druhy.CitacTest
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á 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
Poznámky package com.bruceeckel.simple; //cz.osu.simple; //cz.osu.simple; 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
Popis funkcí
java.applet
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.awt
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.awt.eve Java Abstract Window Toolkid Event Package – nt 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
Popis funkcí
java.io
Java Input Output Package – obsahuje třídy a rozhraní, které programy používají pro vstupně výstupní operace
java.lang
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.net
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
Popis funkcí
java.text
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.util
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
Význam
c
Vytváří nový, nebo prázdný archiv (v případě použití jména existujícího archivu)
t
Vrátí tabulku obsahu
x
Extrahuje všechny zazipované soubory
x file
Extrahuje pouze uvedený soubor
f
specifikace souboru – není-li uvedeno předpoklad stand. vstup, nebo stand. výstup (konzola)
m
Ří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
Příkaz
Vytvoření JAR souboru
jar cf jar-file input-file(s)
Prohlédnutí obsahu JAR souboru
jar tf jar-file
Extrahování obsahu JAR souboru
jar xf jar-file
Extrahování specifikovaných souborů z JAR souboru
jar xf jar-file archived-file(s)
Spuštění aplikace spakované java –jar app.jar jako JAR soubor 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
Spuštění aplikace • java –jar app.jar
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, sirkasirka-20, vyskavyska-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 g.setColor( g.fillOval( g.fillOval(
eyes Color.BLACK ); 55, 65, 30, 30 ); 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