Warning
This page is located in archive.

Základy grafiky v Javě

Tento návod je určen pro zvídavé, tato tématika není součástí kurzu Programování, není vyžadována a nebude zkoušena.

Grafické uživatelské rozhraní umožňuje uživateli komunikovat s programem pomocí grafického rozhraní. Na vytváření grafických rozhraní dostává programátor v Javě dvě knihovny:

  1. AWT, Abstract Window Toolkit, původní knihovna
  2. Swing, nová knihovna postavená na AWT.

Swing je součástí Java Foundation Classes (JFC). Swing se doporučuje používat, protože je moderní a obsahuje dokonalejší prvky. Třídy knihovny Swing začínají písmenem J, například JButton je komponenta, která nahradila Button (tlačítko, knoflík)z AWT. Mezi jeho přidanou funkčnost patří například možnost vložení obrázku. Výrazně se nedoporučuje kombinovat prvky z obou knihoven (mohou vznikat problémy při překreslování). Pro inspiraci, jak mohou vypadat aplikace ve Swingu se navštivte - příklady aplikací ve Swingu.

První kroky

Pro první kroky v grafice použijte tuto jednoduchou hračku. Pro její použití nepotřebujete znát pojmy programovací schéma MVC (model - view - controller), správce rozvržení (Layout manager), posluchač událostí a jeho registrace a mnohé další.

Kreslení základních tvarů

Vykreslování jednotlivých komponent zajišťuje Java, my budeme psát náš kód do metody paintComponent(Graphics g) třídy KresliciPlocha. Pojmenovávání metod využívá jazyka českého, aby byly zjednodušeny první kroky i programátorům s nižší znalostí angličtiny(zároveň je tak odlišen kód využívajíci standardní knihovny). Seznam metod pracujících s grafikou najdete například na stránkách popisujících třídu Graphics. Mezi základní metody patří drawOval(), (vykreslí ovál, tedy téměř elipsu) a drawRect(),(vykreslí obdélník). Další metody začínající draw vykreslují jiná grafická primitiva, metody začínající fill vykreslují vyplněné objekty.

Základní použití grafiky - kreslení fraktálů

Jednoduchou hračku pro kreslení lze upravit na prográmek, který demonstruje použití rekurze při kreslení fraktálů. Tento prográmek si můžete stáhnout jako fraktal.zip. Popis hlavní třídy je uveden v souboru fraktal. Tady najdete návod pro obsluhu základních událostí. Strategie programování - MVC Existuje doporučení pro psaní programů v Javě, které nám umožní napsat přehledný, dobře modifikovatelný program s uživatelských rozhraním. Tento přístup využívá tří částí programu nazývaných

  1. model - (angl. model),
  2. pohled - (angl. view),
  3. řízení, řadič - (angl. controller).

Více o funkci jednotlivých částí a popis jednoduché aplikace využívající tento přístup naleznete v souboru MVC.

Odchytávání více současně stisknutých kláves

V Javě je zdánlivý problém zjištění, které klávesy jsou stisknuty, pokud jich je stisknuto více současně (tento problém nenastává v případě stisku klávesy modifikující význam hlavní klávesy, např. klávesy Shift či Ctrl). Pokud budeme tedy chtít napsat hru pro více hráčů musíme vytvořit seznam stisknutých kláves, do kterého budeme klávesu přidávat, pokud někdo klávesu stiskne (událost keyPressed)a ze seznamu vyndávat při události klávesa puštěna (keyReleased). Pak je samozřejmě nutné měnit model v pravidelných časových intervalech, nikoli pouze při změně stisknuté klávesy.

Tento přístup je dokumentován na jednoduché honičce. Jde o projekt v JBuilderu, s malými úpravami je použitelný i v NetBeans.

Otázky a odpovědi

Jak změním barvu výplně, barvu rámečku, styl výplně, styl rámečku a tloušťku rámečku při kreslení například obdelníku?

Barva pera, které kreslí se mění pomocí příkazu setColor(Color c), tato metoda má parametr typu Color. Nastavení barvy na červenou lze provést těmito dvěma způsoby

  paintComponent(Graphics g){
   ....
   g.setColor(Color.RED);
   // druhý způsob:
   g.setColor(new Color(255,0,0));
  }

Druhý způsob Vám umožní vytvořit vlastní barvu namícháním třech složek RGB, každá složka je reprezentovaná číslem od nuly do 255. Jednotlivé složky jsou Red - červená, Green - zelená a Blue - modrá. Pokud chcete vykreslovat objekty vyplněné, pak použijte místo metody drawRect(.. metodu fillRect(…. Kreslení na plátno, tak jek je popsáno výše, neumožňuje jednoduše kreslit složité útvary se vzory, specifickým ohraničením, apod.

Jak změním a zjistím barvu jednoho pixelu a jak je to rychlé, je možno takhle překreslovat celou obrazovku tak, aby to vypadalo plynule?

Jeden pixel (obrazový bod) lze změnit například pomocí drawLine(x,y,x+1,y). Zjišťování barvy pixelu je možné, ale pro výuku programování nevhodné, protože pixel není vhodný model pro reprezentaci dat v programu. Vhodnější je uchovávat všechny informace v modelu - tak jak je to popsáno výše.

Potrebuji nějaký cyklus, který se bude s určitým intervalem provádět po celou dobu programu a bude vykreslovat plochu (v Delphi TTimer).

Ano i v Javě je obdoba takové třídy. Dokonce existují tyto obdoby dvě, java.util.Timer a třída Timer definovaná v knihovně Swing. Použití časovače - timeru je uvedeno v příkladu hračka MVC.

Jak zjistím pozici myši, aniž bych zmáčkl tlačítko?

Dodefinování obsluhy událostí myši je popsáno ve stejnojmenné kapitole v souboru fraktal.

Jak vykreslím obrázek?

Vykreslení obrázku uloženého v proměnné typu Image zajistíte v metodě paintComponent voláním

g.drawImage(obr,120,120,null);         

, kde 120,120 specifikuje pozici. Toto je základní formát, použitím

  g.drawImage(obr,100,10,obr.getWidth(null)/2, obr.getHeight(null)/2,null);

vykreslíte obrázek v jeho poloviční šířce a výšce. Dojde k jeho zmenšení, nikoli oříznutí. Před použitím proměnné obr ji musíte nejprve inicializovat, nejlépe v konstruktoru modelu. Následující metoda to zajistí pro soubor specifikovaný jménem včetně cesty.

  public Image nactiObrazek(String fileName){
        Image image;
        image = new ImageIcon(fileName).getImage();
        if(image.getWidth(null)<1)System.out.println("Nepodarilo se nacist soubor "+ fileName);
        return image;
    }
Platí, že jestliže vytvořený obrázek má nezápornou šířku, tak se jeho vytvoření podařilo. Ještě je třeba specifikovat jméno souboru a jeho umístění. Náš obrázek bude v adresáři obr. Tyto příkazy by měly zajistit správné nastavení cesty v Solarisu, GNU Linuxu i v MS Windows.
        String userDir = System.getProperty("user.dir");
        String fileSeparator = System.getProperty("file.separator");
        obr = nactiObrazek(userDir +fileSeparator+"obr"+fileSeparator+"sonic.gif");
 
Proměnná userDir reprezentuje adresář odkud je náš projekt spouštěn, proměnná fileSeparator reprezentuje symbol oddělovače souborů - hodnota závislá na operačním systému. Celý projekt je uložen v souboru animgif.zip.

courses/a0b36pri/literature/grafika/start.txt · Last modified: 2015/01/16 21:04 (external edit)