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í.

4. diel - Programovanie jednoduchých Java GUI hier - Obrázky

V tejto kapitole sa naučíme pracovať s obrázkami. Ukážeme si ako vytvoriť inštanciu objektu Image, ako zistiť výšku a šírku obrázka a ako obrázok umiestni 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);
    }
}

Pribudol nám jeden riadok kódu a to

this.setResizable(false);

, Ktorý spôsobí to, že nemožno zmeniť veľkosť okna.

Teraz si vytvoríme triedu KresliciPanel, ktorá bude načítať a vykresľovať zadaný obrázok.

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 importov, ale kód zas až tak dlhý nie je.

private Image obrazek;

Vytvoríme si premennú typu Image a prístupovými právami private. To znamená, že v tejto triede je táto premenná normálne dostupná. Zvonka triedy k nej ale prístup nie je. Čo je správne. S touto premennou budem pracovať v tejto triede, tak nie je vhodné, aby do nej bol prístup odniekiaľ odinakiaľ. Ale späť k našej premennej. Tá je typu Image, čo je abstraktné trieda (nemožno ju vytvoriť priamo použitím new) reprezentujúci grafické obrázky.

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

Pretože objekt triedy Image nedá vytvoriť priamo, použijeme triedu ImageIcon. Ako parameter konstruktoru dáme adresu k nášmu obrázku.

this.getClass()

Metóda this.getClass () vracia triedu this objektu. V mojom prípade to znamená obrazky.Kresli­ciPanel, pretože triedu KresliciPanel mám uloženú v balíčku obrazky.

getResource(String jemnoSouboru)

Táto metóda nájde zdroj s daným menom a vráti jeho URL, čiže adresu. Keď to zhrniem, tak getClass (). GetResource (String jmenoSouboru) vráti URL adresu súboru, ktorý sa nachádza v rovnakom umiestnení ako trieda, kde bol tento kus kódu spustený. Vrátená URL sa odovzdá do konstruktoru ImageIcon a vytvorí sa objekt.

obrazek = ii.getImage();

ImageIcon ponúka metódu getImage (), ktorá vracia objekt typu Image. A prečo vlastne vytvárame objekt typu Image?

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

Pretože objekt Graphics, ktorý nám umožňuje kresliť, má metódu drawImage, ktorá potrebuje ako parameter objekt typu Image, ktorý sa vykreslí na zadané súradnice x, y. Štvrtým parametrom je ImageObserver, čo je rozhranie. Kreslenie obrázku je asynchrónny. Ak nie sú k dispozícii kompletné dáta, informuje sa komponent cez rozhranie ImageObserver akonáhle sa dáta objavia. JPanel, a tým aj naše odvodená trieda, implementuje toto rozhranie.

A tu je výsledok nášho snaženia.

Vykreslenie obrázka na panel v Java Swing - Tvorba hier v Java Swing

Ale určite by to mohlo lepšie vyzerať.

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ýsledok je nasledujúci.

Vykreslenie obrázka na panel v Java Swing - Tvorba hier v Java Swing
private Image obrazek;
private int obrazekSirka;
private int obrazekVyska;
private Rectangle ramObrazku;

Vytvorím si štyri privátne premenné. Jedna bude reprezentovať načítaný obrázok, ďalšie dve šírku a výšku obrázka a posledná obrysový obdĺžnik okolo obrázka.

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

Získanie obrázku sa vykonáva rovnako ako v predchádzajúcom prípade.

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

Trieda Image ponúka metódy na zistenie šírky a výšky obrázku. Ako parameter požadujú obe metódy ImageObserver. Miesto inštancie ImageObserveru je možné uviesť null.

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

this.setPreferredSize(rozmerPanelu);

Rozmer panelu nastavíme na šírku a výšku obrázku + okraje po všetkých stranách 20px.

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

Obrázok vykreslíme na zadanú pozíciu (ľavý horný bod bude na súradniciach: x = 20, y = 20).


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 462x (104.88 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Programovanie jednoduchých Java GUI hier - Text
Všetky články v sekcii
Tvorba hier v Java Swing
Preskočiť článok
(neodporúčame)
Programovanie jednoduchých Java GUI hier - Udalosti
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity