/* Esimerkki: RullaavaTeksti.java. Grafiikkaohjelmointi. Tekijä: Juha Peltomäki, 10.1999. Kuvaus: ohjelmassa demonstroidaan appletin piirtopinnalla tapahtuvaa tekstin vieritystä. */ import java.applet.Applet; import java.awt.*; /* Rullaava teksti. */ public class RullaavaTeksti extends Applet { // Rullattava viesti. String viesti; // Fontti, ja sen mitat. Font teksti_fontti = new Font("Ariel", Font.BOLD, 16); FontMetrics fontin_mitat; // Värit Color tekstin_taustavari = Color.black; Color tekstivari = Color.green; Color taustavari = Color.blue; // Kerralla siirrettävä määrä pikseleitä // X- ja Y-koordinaattien suuntiin. int Xsiirtyma = 5, Ysiirtyma = 1; // Koordinaatit int vanhaX, vanhaY, uusiX, uusiY; int nopeus; /* Alustetaan sovelma. */ public void init() { viesti = getParameter("viesti"); if (viesti == null) viesti = new String("Esitellään tekstinvieritystä. "); String nopeusStr = getParameter("nopeus"); if (nopeusStr == null) nopeus = 50; else nopeus = Integer.parseInt(nopeusStr); // Alustetaan ja aloitetaan animaatio TekstiSaie saie = new TekstiSaie(this, nopeus); saie.start(); } /* Metodi piirtää ruudulle taustakuvion. */ public void paint(Graphics piirtopinta) { piirtopinta.setFont(teksti_fontti); fontin_mitat = piirtopinta.getFontMetrics(); // Piirretään taustavärille liikutettu teksti. piirtopinta.setColor(taustavari); piirtopinta.fillRect(1,1, getSize().width - 1, getSize().height - 1); // Otetaan X- ja Y-koordinaattien vanhat arvot talteen. vanhaX = uusiX = getSize().width - fontin_mitat.charWidth(viesti.charAt(0)); vanhaY = uusiY = getSize().height/5 + (fontin_mitat.getHeight()/2); } /* Metodi piirtää ruudulle edustakuvion. */ public void update(Graphics piirtopinta) { piirtopinta.setFont(teksti_fontti); fontin_mitat = piirtopinta.getFontMetrics(); // Poistetaan vanha viesti piirtopinta.setColor(tekstin_taustavari); piirtopinta.drawString(viesti, vanhaX, vanhaY); // Piirretään uusi viesti piirtopinta.setColor(tekstivari); piirtopinta.drawString(viesti, uusiX, uusiY); // Lasketaan uusi paikka tekstille X-koordinaateissa vanhaX = uusiX; uusiX -= Xsiirtyma; // Siirretään Y-koordinaattia. vanhaY = uusiY; uusiY += Ysiirtyma; // Piirretäänkö tausta uudestaan (näyttää ruudun tyhjäämiseltä). if (uusiX <= -(fontin_mitat.stringWidth(viesti) - fontin_mitat.charWidth(viesti.charAt(viesti.length() - 1))) || uusiY > getSize().height - fontin_mitat.getHeight()) paint(piirtopinta); } } class TekstiSaie extends Thread { RullaavaTeksti appletti; int viive; public TekstiSaie(RullaavaTeksti rt, int v) { appletti = rt; viive = v; } /* Säikeen ajaminen. */ public void run() { while (true) { try { sleep(viive); appletti.repaint(); } catch (Exception poikkeus) { System.out.println("Poikkeusviesti: " + poikkeus.toString()); } } } }