IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 4 - Programování jednoduchých Java GUI her - Obrázky

V předchozí lekci, Programování jednoduchých Java GUI her - Text, jsme si ukázali vykreslování textu na JPanel a řekli si něco o písmu.

V této kapitole se naučíme pracovat s obrázky. Ukážeme si jak vytvořit instanci objektu Image, jak zjistit výšku a šířku obrázku a jak obrázek umísti do panelu.

Obrázky

import javax.swing.JFrame;

public class ZobrazeniObrazku extends JFrame {

    public ZobrazeniObrazku() {
        this.setTitle("Zobrazení Obrázku");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        KresliciPanel panel = new KresliciPanel();
        this.add(panel);

        this.setResizable(false);
        this.pack();
    }

    public static void main(String[] args) {
        ZobrazeniObrazku zo = new ZobrazeniObrazku();
        zo.setVisible(true);
    }
}

Přibyl nám jeden řádek kódu a to

this.setResizable(false);

, který způsobí to, že nelze změnit velikost okna.

Teď si vytvoříme třídu KresliciPanel, která bude načítat a vykreslovat zadaný obrázek.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class KresliciPanel extends JPanel {
    private Image obrazek;

    public KresliciPanel() {
        this.setPreferredSize(new Dimension(400, 300));
        this.setBackground(Color.white);

        ImageIcon ii = new ImageIcon(this.getClass().getResource("obrazek1.jpg"));
        obrazek = ii.getImage();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(obrazek, 5, 5, this);
    }
}

Máme plno importů, ale kód zas až tak dlouhý není.

private Image obrazek;

Vytvoříme si proměnnou typu Image a přístupovými právy private. To znamená, že v této třídě je tato proměnná normálně dostupná. Z vnějšku třídy k ní ale přístup není. Což je správně. S touto proměnnou budu pracovat v této třídě, tak není vhodné, aby do ní byl přístup odněkud jinud. Ale zpět k naší proměnné. Ta je typu Image, což je abstraktní třída (nelze ji vytvořit přímo použitím new) reprezentující grafické obrázky.

ImageIcon ii = new ImageIcon(this.getClass().getResource("obrazek1.jpg"));

Protože objekt třídy Image nelze vytvořit přímo, použijeme třídu ImageIcon. Jako parametr konstruktoru dáme adresu k našemu obrázku.

this.getClass()

Metoda this.getClass() vrací třídu this objektu. V mém případě to znamená obrazky.Kresli­ciPanel, protože třídu KresliciPanel mám uloženu v balíčku obrazky.

getResource(String jemnoSouboru)

Tato metoda najde zdroj s daným jménem a vrátí jeho URL, čili adresu. Když to shrnu, tak getClass().get­Resource(String jmenoSouboru) vrátí URL adresu souboru, který se nachází ve stejném umístění jako třída, kde byl tento kus kódu spuštěn. Vrácená URL se předá do konstruktoru ImageIcon a vytvoří se objekt.

obrazek = ii.getImage();

ImageIcon nabízí metodu getImage(), která vrací objekt typu Image. A proč vlastně vytváříme objekt typu Image?

g.drawImage(obrazek, 5, 5, this);

Protože objekt Graphics, který nám umožňuje kreslit, má metodu drawImage, která potřebuje jako parametr objekt typu Image, který se vykreslí na zadané souřadnice x, y. Čtvrtým parametrem je ImageObserver, což je rozhraní. Kreslení obrázku je asynchronní. Pokud nejsou k dispozici kompletní data, informuje se komponenta přes rozhraní ImageObserver jakmile se data objeví. JPanel, a tím i naše odvozená třída, implementuje toto rozhraní.

A tady je výsledek našeho snažení.

Vykreslení obrázku na panel v Java Swing - Tvorba her v Java Swing

Ale určitě by to mohlo lépe vypadat.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class KresliciPanel extends JPanel {

    private Image obrazek;
    private int obrazekSirka;
    private int obrazekVyska;

    public KresliciPanel() {

        ImageIcon ii = new ImageIcon(this.getClass().getResource("obrazek1.jpg"));
        obrazek = ii.getImage();

        obrazekSirka = obrazek.getWidth(this);
        obrazekVyska = obrazek.getHeight(this);

        int x = 20 + obrazekSirka + 20;
        int y = 20 + obrazekVyska + 20;
        Dimension rozmerPanelu = new Dimension(x, y);

        this.setPreferredSize(rozmerPanelu);
        this.setBackground(Color.WHITE);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(obrazek, 20, 20, this);
    }
}

Výsledek je následující.

Vykreslení obrázku na panel v Java Swing - Tvorba her v Java Swing
private Image obrazek;
private int obrazekSirka;
private int obrazekVyska;
private Rectangle ramObrazku;

Vytvořím si čtyři privátní proměnné. Jedna bude reprezentovat načtený obrázek, další dvě šířku a výšku obrázku a poslední obrysový obdélník okolo obrázku.

ImageIcon ii = new ImageIcon(this.getClass().getResource("obrazek2.jpg"));
obrazek = ii.getImage();

Získání obrázku se provádí stejně jako v předchozím případě.

obrazekSirka = obrazek.getWidth(this);
obrazekVyska = obrazek.getHeight(this);

Třída Image nabízí metody pro zjištění šířky a výšky obrázku. Jako parametr požadují obě metody ImageObserver. Místo instance ImageObserveru je možné uvést null.

int x = 20 + obrazekSirka + 20;
int y = 20 + obrazekVyska + 20;
Dimension rozmerPanelu = new Dimension(x, y);

this.setPreferredSize(rozmerPanelu);

Rozměr panelu nastavíme na šířku a výšku obrázku + okraje po všech stranách 20px.

g.drawImage(obrazek, 20, 20, this);

Obrázek vykreslíme na zadanou pozici (levý horní bod bude na souřadnicích: x = 20, y = 20).

V příští lekci, Programování jednoduchých Java GUI her - Události, se podíváme na to, co jsou události a jak se v Javě používají.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 462x (104.88 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Programování jednoduchých Java GUI her - Text
Všechny články v sekci
Tvorba her v Java Swing
Přeskočit článek
(nedoporučujeme)
Programování jednoduchých Java GUI her - Události
Článek pro vás napsal vita
Avatar
Uživatelské hodnocení:
10 hlasů
vita
Aktivity