IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

7. diel - Programovanie jednoduchých Java GUI hier - Časovač

V dnešnom diele rozhýbe objekt na JPanelu.

Časovač

Ak budete chcieť vytvoriť pohybujúci sa objekt na obrazovke, dosiahnete to tak, že daný objekt budete vykresľovať a zároveň tomuto objektu posúvať súradnice. Proste ho budete postupne vykresľovať na ľahko zmenené pozície a ak to vykresľovanie bude dostatočne rýchle, vznikne dojem, že sa objekt posúva. Aby sme to dosiahli, potrebujeme nejakú slučku (cyklus), v ktorom bude kód pre pohyb objektu (zmena jeho aktuálnej pozície) a jeho vykreslenie, a ktorý sa bude v určitom intervale (napríklad každých 20 milisekúnd čo je 50-krát za sekundu) znova vykonávať.

Tohto možno dosiahnuť použitím časovača (timer), ktorý funguje tak, akoby ste v programe mali neviditeľné tlačidlo, ktoré sa vždy po určitom časovom intervale samo stlačí a vygeneruje nám známu udalosť ActionEvent. Je to úplne rovnaké ako s JButton. Vytvoríme poslucháča, ktorý bude implementovať rozhranie ActionListener a do metódy actionPerformed (ActionEvent e) umiestnime kód, ktorý sa má vykonávať.

import javax.swing.JFrame;

public class ProgramSCasovacem extends JFrame {

    public ProgramSCasovacem() {
        this.setTitle("Časovač");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

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

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

Na triede s hlavnou oknom programu nie je nič nové.

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MujPanel extends JPanel {
    private JLabel navesti;
    private long citac;

    public MujPanel() {
        this.citac = 0;
        this.setPreferredSize(new Dimension(80, 30));

        navesti = new JLabel();
        this.add(navesti);
        navesti.setText(String.valueOf(citac));

        PosluchacCasovace posluchac = new PosluchacCasovace();
        Timer casovac = new Timer(10, posluchac);
        casovac.start();
    }

    private class PosluchacCasovace implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            citac++;
            navesti.setText(String.valueOf(citac));
        }
    }
}
Použitie Timeru v Java Swing - Tvorba hier v Java Swing

Importy nám sú známe, len upozorním, že budeme používať triedu Timer z balíčka javax.swing.Timer (nie java.util.Timer).

this.citac = 0;

V konstruktoru inicializujeme premennú citácie na hodnotu nula.

navesti.setText(String.valueOf(citac));

Text na návestie (štítku) nastavíme na hodnotu premennej čítač (čiže na nulu). JLabel požadujú ako parameter textový reťazec, preto hodnúť premenné citáciu, ktorá je číslo (typu long), prevedieme na reťazec (metóda String.valueOf ()).

PosluchacCasovace posluchac = new PosluchacCasovace();

Vytvoríme objekt, ktorému budeme zasielať správy.

Timer casovac = new Timer(10, posluchac);

Vytvoríme časovač. Prvý parameter mu hovorí, po koľkých milisekundách má generovať udalosti. Ako druhý parameter mu zadáme poslucháčov, ktorému bude tieto udalosti zasielať.

casovac.start();

A nakoniec časovač spustíme.

public void actionPerformed(ActionEvent e) {
    citac++;
    navesti.setText(String.valueOf(citac));
}

Pri každom vygenerovanie udalosti sa táto udalosť zašle zaregistrovanému poslucháči, presnejšie povedané je zavolaná posluchačova metóda actionPerformed (ActionEvent e). My tu iba zvýšime hodnotu premennej citácie o jedna a túto hodnotu vypíšeme.

O tom ako vzniká ilúzia pohybu sme sa rozprávali na začiatku. Teraz prišiel čas na to vysvetliť si systém súradníc. Tak ako v matematike, aj tu je os xa os y. Je tu ale malý rozdiel. Súradnice začínajú v ľavom hornom rohu obrazovky kde x = 0 a y = 0. Hodnota x rastie doprava, y nadol. Ak budete mať monitor s rozlíšením 800x600, pozícia x = 799, y = 599 bude v dolnom pravom rohu ax = 400, y = 300 bude približne uprostred.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MujPanel extends JPanel {
    private String text = "TEXT";
    private int x, y;
    private int smerX, smerY;

    public MujPanel() {
        this.x = 0;
        this.y = 0;
        this.smerX = 1;
        this.smerY = 1;
        this.setPreferredSize(new Dimension(400, 300));
        this.setBackground(Color.green);

        Font font = new Font("Monospaced", Font.BOLD, 40);
        this.setFont(font);

        Timer casovac = new Timer(20, new PosluchacCasovace());
        casovac.start();

    }

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

        g.drawString(text, x, y);
    }

    private void move() {
        x += smerX;
        y += smerY;

        if (x >= this.getWidth() || x <= 0) {
            smerX = -smerX;
        }
        if ((y >= this.getHeight()) || (y <= 0)) {
            smerY = -smerY;
        }
    }

    private class PosluchacCasovace implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            move();
            repaint();
        }
    }
}
Pohyb objektov v Java Swing pomocou Timeru - Tvorba hier v Java Swing
private String text = "TEXT";

Premenná uchovávajúce text, ktorý budeme zobrazovať.

private int x, y;

Deklarácia dvoch premenných typu int, ktoré budú uchovávať aktuálnu pozíciu.

private int smerX, smerY;

Deklarácia dvoch premenných typu int, ktoré budú uchovávať aktuálny smer pohybu.

Timer casovac = new Timer(20, new PosluchacCasovace());
casovac.start();

Tento zápis zodpovedá predchádzajúcemu, len ušetríme jeden riadok a nemusíme vymýšľať názov pre premennú typu PosluchacCasovace. Je vytvorený nový Timer, ktorý bude generovať udalosti každých dvadsať milisekúnd a ako poslucháčov si registruje objekt PosluchacCasovace, ktorý je vytvorený pomocou new.

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

    g.drawString(text, x, y);
}

Vykreslí pozadie a text so začiatkom na pozíciu x, y. Táto metóda sa volá pri prvotnom vytvorení JPanelu a tiež sa volá zakaždým, keď voláme metódu prekreslenie ().

private void move() {
    x += smerX;
    y += smerY;

    if (x >= SIRKA || x <= 0) {
        smerX = -smerX;
    }
    if ((y >= VYSKA) || (y <= 0)) {
        smerY = -smerY;
    }
}

Aktuálne x-ová pozície sa posunie o hodnotu v premennej smerX (x = x + smerX). To isté sa stane s y-novou súradnicou. V prípade, že by x (to je počiatkom texte) bolo väčšie ako veľkosť panelu (alebo menšie), premenná smerX sa zmení na opačnú a text sa začne pohybovať v opačnom x-ovom smere. Obdobné je to pre y-novú súradnicu, kde sa kontroluje, či nie je väčšia (menšia) ako výška panela.

private class PosluchacCasovace implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        move();
        repaint();
    }
}

Ak je vygenerovaná udalosť, objekt (v tomto prípade Timer), ktorý ju vygenerovať, sa pozrie, či má registrovaného nejakého poslucháča. Ak áno, zavolá posluchačovu metódu actionPerformed (ActionEvent e), v ktorej je uvedené, čo sa má v takomto prípade vykonať.

V našom príklade je volaná metóda move (), ktorá zmení súradnice xa yo jeden bod a potom sa volá metóda prekreslenie (), ktorá zavolá metódu paint (), ktorá potom zavolá metódy intComponent (), paintBorder (), and paintChildren (). Aby som to skrátil. Zavolaním metódy prekreslenie () sa zavolá aj naša metóda paintComponent () a tým sa vykoná všetko, čo sme do nej nadefinovali.


 

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é 338x (2.5 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

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