Swing. Vlastní kreslení

Podobné dokumenty
GUI. Systémová integrace pro desktopové aplikace

Swing. Vlastní kreslení

Swing. Vlákna. Java UI, letní semestr 2017/2018 1

Swing Vlákna Java, zimní semestr

JAVA. Krátce o Reflection API

JAVA. Reflection API

JAVA. Odbočka: Návrhové vzory (Design patterns)

Swing. Přehled komponent. Java UI, letní semestr 2017/2018 1

Java - Kresba. 2/28/11 1/8 Java - kresba

Java aplety. Předávání parametrů z HTML

Pokročilé programování na platformě Java. Úvod

GUI. Systémová integrace pro desktopové aplikace

Platformy NetBean a Eclipse. Úvod

JAVA. Odbočka: Návrhové vzory (Design patterns)

Aplikace s grafickým uživatelským rozhraním

JAVA. HTTP API (klient)

Logování zaznamenávání informací o průběhu programu, ladících a chybových informací

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Vláknové programování část V

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Java a XML. 10/26/09 1/7 Java a XML

Platformy NetBean a Eclipse. Úvod

Iterator & for cyklus

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Úvod do programovacích jazyků (Java)

Programování v Javě I. Únor 2009

Programování v Javě I. Leden 2008

Programátorská příručka

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Logování. Log4J. Základní pojmy používané v log4j

Generické programování

Vývoj desktopových aplikací v Jazyce Java s bohatým grafickým uživatelským rozhraním.

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

2 Grafický výstup s využitím knihovny

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Reflexe RTTI Runtime Type Identification

typová konverze typová inference

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java Výjimky Java, zimní semestr

UJO Framework. revoluční architektura beans. verze

Obrázek 6.14: Prohlížec nápovedy

Vytváření a použití knihoven tříd

Postřehová hra. Zadání projektu. 1 Moje cíle

Algoritmizace a programování

Java - výjimky. private void vstup() throws IOException {... }

JSR tutorial 2 Transformace v JSR-184

JAVA Moduly Java, letní semestr 2018

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java Enum Java, zimní semestr ,2017 1

GUI v Javě a událostmi řízené programování

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

GUI - úvod. V této kapitole si ukážeme návod, jak vytvořit jednoduchou grafickou aplikaci a umístit do ní některé další grafické prvky.

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

JAVA JavaBeans Java, letní semestr

GUI v Javě a událostmi řízené programování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

20. Projekt Domácí mediotéka

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

GUI v Javě a událostmi řízené programování

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Teoretické minimum z PJV

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Konstruktory a destruktory

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Grafické uživatelské rozhraní v Javě. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Seminář Java IV p.1/38

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

JAVA Unit testing Java, zimní semestr

RMI Remote Method Invocation

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

Seminář Java II p.1/43

JSR tutorial 1 Úvod do JSR-184

Jazyk C# (seminář 6)

JAVA JavaBeans Java, letní semestr 2018

JAVA V RMI Java, letní semestr

GUI v Javě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy. MVC Model-View-Controller

Práce se soubory v Javě

Úvod do programovacích jazyků (Java)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

JAVA. Další jazyky kompilovatelné do Java byte-code

VIII. Seminář Java VIII p.1/36

Abstraktní datové typy: zásobník

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Téma 12 - Textové soubory a výjimky

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

IRAE 07/08 Přednáška č. 7. Začátek (head)

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Vlákna. První jednoduchý program s vlákny:

Grafické uživatelské rozhraní v Javě. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Typický prvek kolekce pro české řazení

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Podmínky na zápočet. Java, zimní semestr

JAVA. Java Management Extensions JMX

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Transkript:

Swing Vlastní kreslení

Přehled u GUI komponenty předefinovat metodu public void paintcomponent(java.awt.graphics g) Graphics poskytuje metody pro kreslení obvykle instance potomka Graphics2D class MyPanel extends JPanel { public void paintcomponent(graphics g) { super.paintcomponent(g); g.drawstring("this is my custom Panel!",10,20); 2

Přehled lze předefinovat u jakékoliv komponenty obvykle se používá JPanel např. pro vytváření her lze i ostatní komponenty např. tlačítka apod. lze dědit i přímo od JComponent metoda paintcomponent()se volá automaticky, když je potřeba explicitně lze požádat o překreslení zavoláním metody repaint() nezavolá paintcomponent() přímo, ale dá fronty událostí požadavek na překreslení při více požadavcích za sebou se překreslí jen jednou 3

Přehled repaint() existuje v několika verzích bez parametrů překreslení celé komponenty s parametry překreslení jen daného obdélníku odbočka mechanizmus vykreslování převzat (a upraven) z AWT v AWT vlastní vykreslovaní přes metody paint() a update() defaultní implementace update() volá paint() ve Swingu z paint() se zavolá paintcomponent() a ještě metody paintborder() a paintchildren() ty ale není obvykle potřeba předefinovat 4

JAVA Odbočka k Reflection API 5

Přehled reflection, introspection umožňuje zjišťování informací o třídách, atributech, metodách vytváření objektů volání metod... balík java.lang.reflect třída java.lang.class 6

java.lang.class instance třídy Class reprezentuje třídu (interface, enum,...) v běžícím programu primitivní typy také reprezentovány jako instance třídy Class nemá žádný konstruktor instance vytvářeny automaticky při natažení kódu třídy do JVM třídy jsou natahovány do JVM až při jejich prvním použití 7

java.lang.class získání instance třídy Class getclass() metoda na třídě Object vrátí třídu objektu, na kterém je zavolána literál class JmenoTridy.class třída pro daný typ Class.forName(String classname) statická metoda vrátí třídu daného jména pro primitivní typy statický atribut TYPE na wrapper třídách Integer.TYPE literál class int.class 8

java.lang.class třídy do JVM natahuje classloader java.lang.classloader standardní classloader hledá třídy v CLASSPATH lze si napsat vlastní classloader Class.forName(String classname, boolean initialize, ClassLoader cl) natáhne třídu daným classloaderem a vrátí objekt třídy Class getclassloader() metoda na Class classloader, kterým byla třída natažena 9

java.lang.class: metody String getname() vrátí jméno třídy pro primitivní typy vrátí jeho jméno pro pole vrátí řetězec začínající znaky [ (tolik, kolik má pole dimenzí) a pak označení typu elementu Z..boolean, B..byte, C..char, D..double, F..float, I..int, J..long, S..short, Lclassname..třída nebo interface String.class.getName() // vrátí "java.lang.string" byte.class.getname() // vrátí "byte" (new Object[3]).getClass().getName() // vrátí "[Ljava.lang.Object;" (new int[3][4][5][6][7][8][9]).getclass().getname() // vrátí "[[[[[[[I" 10

java.lang.class: metody public URL getresource(string name) public InputStream getresourceasstream(string name) načte nějaký zdroj obrázky,..., cokoliv data načítá classloader => načítání se řídí stejnými pravidly jako načítání tříd jméno zdroje ~ hierarchické jméno jako u tříd oddělovací tečky jsou nahrazeny lomítky '/' 11

Swing Práce s obrázky 12

Přehled základní třída (ještě z AWT) java.awt.image předpoklad (z dob JDK 1.0) obrázky se stahují po síti získání obrázku applet metoda getimage() aplikace Toolkit.getDefaultToolkit().getImage() vykreslení g.drawimage() // Graphics g; podpora GIF, PNG, JPG 13

Příklad import javax.swing.*; import java.awt.*; public class ShowImage extends JApplet { private Image im; public void init() { im = getimage( getdocumentbase(), "ball.gif"); public void paint(graphics g) { g.drawimage(im, 0, 0, this); problém getimage() obrázek nenatahuje, pouze alokuje paměť obrázek natahuje až drawimage() v průběhu vykreslování 14

Vykreslování Graphics.drawImage(Image img, int x, int y, ImageObserver observer) ImageObserver monitoruje nahrávání obrázku opakovaně se volá imageupdate() implicitní chování je zavolání repaint() JApplet i JFrame implementují ImageObserver MediaTracker třída přednatažení obrázků public void init() { im = getimage(getdocumentbase(), "ball.gif"); MediaTracker tracker = new MediaTracker(this); tracker.addimage(im, 0); try { tracker.waitforid(0); catch (InterruptedException e) { System.out.println("Download Error"); 15

ImageIcon kombinace Image a ImageTracker im = new ImageIcon( getdocumentbase()+"ball.gif").getimage(); lze použít pro jakékoliv obrázky ne nutně jen ikony (malé obrázky) typické použití v aplikacích im = new ImageIcon( getclass().getresource("ball.gif") ).getimage(); 16

Java 2D API přidáno v pozdějších verzích rozšíření grafických operací základní třída java.awt.graphics2d potomek java.awt.graphics metoda paintcomponent() má stále parametr jen typu Graphics => musí se explicitně přetypovat lze v podstatě vždy u aktivního vykreslování (viz dále ve slidech) návratovou hodnotu getgraphics() také přetypovat na Graphics2D poskytuje více operací než Graphics lépe se používá 17

BufferedImage potomek Image balíček java.awt.image snadný přístup k datům obrázků automaticky se převádějí na managed image, které umožňují používat HW akceleraci nahrávání pomocí javax.imageio.imageio.read() mělo by být rychlejší než ImageIcon operace nad BufferedImage třídy implementující java.awt.image.bufferedimageop různé transformace AffineTransformOp, ColorConvertOp,... 18

Swing Vykreslování ve hrách

Přehled příklady převzaty z knihy A. Dawison: Killer Game Programming in Java kniha volně ke stažení na http://fivedots.coe.psu.ac.th/~ad/jg/ není to finální verze knihy jsou zde ale i některé kapitoly navíc kniha existuje i v českém překladu Programování dokonalých her v Javě 20

Příklad 1 1/2 public class GamePanel extends JPanel implements Runnable { private static final int PWIDTH = 500; private static final int PHEIGHT = 400; private Thread animator; private boolean running = false; private boolean gameover = false; : public GamePanel() { setbackground(color.white); setpreferredsize( new Dimension(PWIDTH, PHEIGHT));... public void addnotify() { super.addnotify(); startgame(); private void startgame() { if (animator == null!running) { animator = new Thread(this); animator.start(); 21

Příklad 1 2/2... public void stopgame() { running = false; public void run() { running = true; while(running) { gameupdate(); gamerender(); repaint(); try { Thread.sleep(20); catch(interruptedexception ex) { System.exit(0); private void gameupdate() { if (!gameover)...... 22

Příklad 1 Vykreslování použití double buffering kreslení do bufferu mimo obrazovku překopírování bufferu naráz na obrazovku private Graphics dbg; private Image dbimage = null; : private void gamerender() { if (dbimage == null){ dbimage = createimage(pwidth, PHEIGHT); if (dbimage == null) { System.out.println("dbImage is null"); return; else dbg = dbimage.getgraphics(); dbg.setcolor(color.white); dbg.fillrect (0, 0, PWIDTH, PHEIGHT);...... if (gameover) gameovermessage(dbg); // end of gamerender() private void gameovermessage(graphics g) { g.drawstring(msg, x, y); 23

Příklad 1 Vykreslování překopírování bufferu v paintcomponent() public void paintcomponent(graphics g) { super.paintcomponent(g); if (dbimage!= null) { g.drawimage(dbimage, 0, 0, null); 24

Příklad 1 Vstup přidání reakce na vstup od uživatele public GamePanel() { setbackground(color.white); setpreferredsize( new Dimension(PWIDTH, PHEIGHT)); setfocusable(true); requestfocus(); readyfortermination();... addmouselistener( new MouseAdapter() { public void mousepressed(mouseevent e) { testpress(e.getx(), e.gety()); ); 25

Příklad 1 Vstup private void readyfortermination() { addkeylistener( new KeyAdapter() { public void keypressed(keyevent e) { int keycode = e.getkeycode(); if ((keycode == KeyEvent.VK_ESCAPE) (keycode == KeyEvent.VK_Q) (keycode == KeyEvent.VK_END) ((keycode == KeyEvent.VK_C) && e.iscontroldown()) ) { running = false; ); private void testpress(int x, int y) { if (!gameover) {... 26

Příklad 1 Problémy proměnné running a gameover by měly být volatile v aplikaci je více vláken, každé může mít lokální kopii proměnných (kvůli rychlosti) pokud budou volatile, nebudou v lokální kopii repaint() je pouze požadavek na překreslení nelze zajistit kdy se provede ani zjistit jak dlouho trvá nelze odhadnout, jak dlouhý čas dát do sleep() sleep je nutný uvolnění procesoru může se provést repaint() 27

Příklad 2 aktivní vykreslování public void run() { running = true; while(running) { gameupdate(); gamerender(); paintscreen(); try { Thread.sleep(20); catch(interruptedexception ex){ System.exit(0); private void paintscreen() { Graphics g; try { g = this.getgraphics(); if ((g!= null) && (dbimage!= null)) g.drawimage(dbimage, 0, 0, null); g.dispose(); Toolkit.getDefaultToolkit().sync(); catch (Exception e) { System.out. println("graphics context error: " + e); 28

Příklad 3 vykreslování je plně pod kontrolou => lze měřit, jak dlouho trvá => lze nastavit čas do sleep() podle požadovaných FPS public void run() { long beforetime, timediff, sleeptime; beforetime = System.currentTimeMillis(); running = true; while(running) { gameupdate(); gamerender(); paintscreen(); timediff = System.currentTimeMillis() - beforetime; sleeptime = period - timediff; if (sleeptime <= 0) sleeptime = 5; try { Thread.sleep(sleepTime); catch(interruptedexception ex){ beforetime = System.currentTimeMillis(); System.exit(0); 29

Příklad 3 proměnné period obsahuje požadované FPS v milisekundách př. FPS 100 1000/100 = 10 ms možné problémy nepřesnost časovače různá přesnost na různých systémech lépe použít System.nanoTime() další možnosti vylepšení počítat nepřesnosti časovače oddělit periodu vykreslování a aktualizace hry 30

Full-Screen Executive Mode od JDK 1.4 přístup přímo do video paměti obchází většinu Swingu a AWT třída VolatileImage akcelerované obrázky obvykle není potřeba používat přímo Swing je použije pokud to lze 31

Full-Screen Executive Mode private GraphicsDevice gd; private Graphics gscr; private BufferStrategy bufferstrategy; : private void initfullscreen() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gd = ge.getdefaultscreendevice(); setundecorated(true); setignorerepaint(true); setresizable(false); if (!gd.isfullscreensupported()) { System.out.println("Full-screen exclusive mode not supported"); System.exit(0); gd.setfullscreenwindow(this); // setdisplaymode(800, 600, 8); // setdisplaymode(1280, 1024, 32); 32

Full-Screen Executive Mode page flipping vykreslovaní do více bufferů nekopírují se jako u double bufferingu pouze se přehazuje ukazatel ve video RAM, co se má zobrazit nastavení počtu bufferů try { EventQueue.invokeAndWait( new Runnable() { public void run() { createbufferstrategy(num_buffers); ); catch (Exception e) { System.exit(0); try { Thread.sleep(500); catch(interruptedexception ex) { bufferstrategy = getbufferstrategy(); 33

Full-Screen Executive Mode private void screenupdate() { try { gscr = bufferstrategy.getdrawgraphics(); gamerender(gscr); gscr.dispose(); if (!bufferstrategy.contentslost()) bufferstrategy.show(); else System.out.println("Contents Lost"); catch (Exception e) { e.printstacktrace(); running = false; private void gamerender(graphics gscr) { gscr.setcolor(color.white); gscr.fillrect (0, 0, pwidth, pheight); 34

Full-Screen Executive Mode ukončení private void restorescreen() { Window w = gd.getfullscreenwindow(); if (w!= null) w.dispose(); gd.setfullscreenwindow(null); 35

Další... JOGL https://jogl.dev.java.net/ používání OpenGL z Javy Java3D API https://java3d.dev.java.net/... 36

GUI Systémová integrace pro desktopové aplikace 37

java.awt.desktop systémová integrace desktopových aplikací static boolean isdesktopsupported() test zda je integrace k dispozici static Desktop getdesktop() vrátí instanci void browse(uri uri) otevře uri v defaultním prohlížeči void edit(file file) otevře soubor v defaultním editoru pro daný typ souboru void mail(uri mailtouri) otevře defaultní mailový klient void open(file file) otevře soubor v defaultní aplikaci pro daný typ void print(file file) tisk souboru 38

java.awt.desktop boolean issupported(desktop.action action) test, co je podporováno Desktop.Action enum hodnoty BROWSE EDIT MAIL OPEN PRINT 39

java.awt.systemtray reprezentuje systémový tray př. TrayIcon trayicon = null; if (SystemTray.isSupported()) { SystemTray tray = SystemTray.getSystemTray(); Image image =... ActionListener listener = new ActionListener() { public void actionperformed(actionevent e) {... ; PopupMenu popup = new PopupMenu(); popup.add(...); trayicon = new TrayIcon(image, "Tray Demo", popup); trayicon.addactionlistener(listener); tray.add(trayicon); 40

java.awt.systemtray pravý stisk tlačítka na ikonu zobrazí menu levý stisk generuje action event jedna aplikace může přidat libovolné množství ikon metody static boolean issupported() void add(trayicon icon) void remove(trayicon icon) odebere ikonu z traye při ukončení aplikace jsou ikony odebrány automaticky TrayIcon[] gettrayicons() vrací všechny tray ikony aplikace 41

Swing Různé... 42

JToolBar lišta s tlačítky lze přetáhnout na jiné místo lze i vytrhnout 43

JSplitPane zobrazení 2 komponent vedle sebe pod sebe oddělovač mezi komponentami lze posouvat 44

Actions oddělení komponenty a její funkce pro tlačítka, menu,... stejná akce přiřazená k více komponentám Action interface lze nastavit zobrazovaný text ikonu popis klávesovou zkratku action listener... AbstractAction třída implementující interface Action typicky se od ní dědí 45

JTable tabulka konstruktory (některé) JTable(Object[][] rowdata, Object[] columnnames) JTable(TableModel dm) 46

TableModel void addtablemodellistener(tablemodellistener l) Class<?> getcolumnclass(int columnindex) int getcolumncount() String getcolumnname(int columnindex) int getrowcount() Object getvalueat(int rowindex, int columnindex) boolean iscelleditable(int rowindex, int columnindex) void removetablemodellistener(tablemodellistener l) void setvalueat(object avalue, int rowindex, int columnindex) 47

AbstractTableModel předpřipravená implementace modelu stačí naimplementovat pouze metody public int getcolumncount() public int getrowcount() public Object getvalueat(int row, int col) 48

JColorChooser výběr barvy lze použít jako dialog jako komponenta 49

JDesktopPane okna v okně JDesktopPane plocha JInternalFrame vnitřní okno 50

JAVA java.util.logging 51

Přehled API pro vytváření logů aplikace používá Logger metody log() Logger vytváří LogRecord a předává ho Handleru Handler zajišťuje vypisování logů na obrazovku, do souboru,... Filter filtrování logovaných zpráv Formatter formátování zpráv LogManager přímo se (obvykle) nepoužívá jeden globální objekt, spravuje loggery 52

Logger hierarchická struktura - strom logger posílá zprávy i do předka názvy loggerů by měly kopírovat hierarchii tříd několik úrovní zpráv java.util.logging.level SEVER WARNING INFO CONFIG FINE FINER FINEST lze určit, od které úrovně výše se budou zprávy logovat (nižší se budou zahazovat) 53

Handler několik předdefinovaných handlerů Handler abstraktní třída, ostatní od ní dědí StreamHandler do OutputStream ConsoleHandler do System.err FileHandler do souboru jeden nebo "rotování" souboru SocketHander po síti MemoryHadler do bufferu vlastní handler podědit od Handler 54

Formatter SimpleFormatter text "human-readable" XMLFormatter xml 55

Logování metody na Logger podle levelu sever(string msg) warning(string msg)... obecné log(level l, String msg) log(level l, String msg, Object o) log(level l, String msg, Throwable t) odkud logováno logp(level l, String sourceclass, String sourcemethod, String msg)... 56

Příklad static Logger logger = Logger.getLogger("cz.cuni.mff.java.logging.TestLog");... logger.info("doing stuff"); try{... catch (Throwable ex){ logger.log(level.warning, "exception occured",ex); logger.info("done"); 57

Externí konfigurace pomocí properties java.util.logging.config.file obvyklá struktura pro properties (jmeno=hodnota) <logger>.hadlers = seznam handlerů pro daný logger <logger>.level = level pro daný logger... bez úvodního jména kořenový logger java.util.logging.config.class třída zodpovědná za načítání konfigurace předchozí property pak nemusí mít žádný význam 58

Java, zimní semestr Verze prezentace 2014 J11.cz.2014.01 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 59