Java ja grafiikka. Ville Sundberg 12.12.2007

Samankaltaiset tiedostot
JAVA-OHJELMOINTI 3 op A274615

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Sovelmat. Janne Käki

Olio-ohjelmointi Käyttöliittymä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Mikä yhteyssuhde on?

Listarakenne (ArrayList-luokka)

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Ohjelmointi 2 / 2010 Välikoe / 26.3

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Metodien tekeminen Javalla

GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

1 Tehtävän kuvaus ja analysointi

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Olio-ohjelmointi Javalla

Rajapinta (interface)

Harjoitustyö (TKO_2023)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Oliosuuntautuneita apletteja

4. Luokan testaus ja käyttö olion kautta 4.1

Poikkeustenkäsittely

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Luokan sisällä on lista

Osio 4: Graafinen käyttöliittymä

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Taulukoiden käsittely Javalla

9. Periytyminen Javassa 9.1

Rinnakkaisohjelmointi, Syksy 2006

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Javan perusteita. Janne Käki

public static void main (String [] args)

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Java-API, rajapinnat, poikkeukset, UML,...

Ohjelmoinnin jatkokurssi, kurssikoe

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

15. Ohjelmoinnin tekniikkaa 15.1

9. Periytyminen Javassa 9.1

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Osio 4: Graafinen käyttöliittymä

58131 Tietorakenteet ja algoritmit (syksy 2015)

Luokat ja oliot. Ville Sundberg

YHTEYSSUHDE (assosiation)

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Osio 4: Graafinen käyttöliittymä

16. Javan omat luokat 16.1

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Teskstialue (JTextArea) ja Scrollaus (JScrollPane)

Javan GUI Scratchaajalle

<applet code="simpleaudioapplet.class" width=300 height=300>

20. Javan omat luokat 20.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Ohjelmointi 2 / 2011 Välikoe / 25.3

JUnit ja EasyMock (TilaustenKäsittely)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Oliot viestivät metodeja kutsuen

Ohjelmointityö 3. Mikko Laamanen

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Ohjelmoinnin peruskurssien laaja oppimäärä

Tietorakenteet, laskuharjoitus 7,

7. Oliot ja viitteet 7.1

Pakkauksen kokoaminen

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

17. Javan omat luokat 17.1

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Tietorakenteet (syksy 2013)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Olio-ohjelmointi Virhetilanteiden käsittely

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Lista luokan sisällä

Vahva koostumussuhde (Composition)

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

Javan GUI Scratchaajalle

KOHDELUOKAN MÄÄRITTELY

Metodien tekeminen Javalla

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet, kurssikoe

Tietorakenteet, laskuharjoitus 4,

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Tietokannat II -kurssin harjoitustyö

Ohjelmointi 2, välikoe

11. Javan valintarakenteet 11.1

11. Javan valintarakenteet 11.1

Transkriptio:

Java ja grafiikka Ville Sundberg 12.12.2007

What happen Viritetty JPanel Graphics ja Graphics2D ImageIO ja BufferedImage Animaatio ja ajastus Optimoinnista

Kehykset import javax.swing.jframe; public class Piirto { public static void main(string[] args) { JFrame frame = new JFrame("Piirto"); frame.add(new Piirtopaneeli()); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.pack(); frame.setlocationrelativeto(null); frame.setvisible(true);

Piirtopaneeli 0.1 public class Piirtopaneeli extends JPanel { public Piirtopaneeli() { this.setpreferredsize(new Dimension(800, 520)); protected void paintcomponent(graphics g) {

Kaiken ydin Tämänniminen metodi määrää komponentin ulkoasun. Voimme piirtää mitä tahansa, jos ylikirjoitamme sen. protected void paintcomponent(graphics g) { Tämä on grafiikkakonteksti eli olio, jonka avulla piirtäminen onnistuu. Piirtojärjestelmä luo sen meille aivan automaattisesti.

Piirtopaneeli 0.5 public class Piirtopaneeli extends JPanel { public Piirtopaneeli() { this.setpreferredsize(new Dimension(400, 300)); protected void paintcomponent(graphics g) { g.setcolor(color.green); g.fillrect(100, 100, 200, 170); g.setcolor(color.red); g.filloval(500, 250, 200, 200); // ( x, y, leveys, korkeus)

Graphics2D Graphics on todellisuudessa vanhentunutta tekniikkaa. Graphics2D g2d = (Graphics2D) g; Nykyisin Graphics-muuttujassa piilee Graphics2D-olio, jonka saamme käyttöön tyyppimuunnoksen avulla. Graphics2D:n API on yhtenäisempi ja sillä voi piirtää monipuolisemmin. (Kaikki vanhatkin konstit ovat käytössä.)

Piirtopaneeli 1.0 protected void paintcomponent(graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setcolor(color.green); g2d.fill(new Rectangle(100, 100, 200, 170)); g2d.setcolor(color.red); g2d.fill(new Ellipse2D.Double(500, 250, 200, 200)); Metodi fill ottaa parametrinaan geneerisen Shape-olion eli muodon. Sekä Rectangle että Ellipse2D.Double ovat muotoja.

Sudit ja maalit Graphics2D-luokka tukee erilaisia piirtomoodeja. g2d.setstroke(new BasicStroke(15f)); setstroke-metodilla asetetaan mm. reunojen ja viivojen piirtotapa. Tässä luodaan uusi, 15 pikselin levyinen Perussuti. g2d.setpaint(new GradientPaint(... )); setpaint-metodilla taas vaikutetaan alueiden täyttötapaan.

Piirtopaneeli 1.1 protected void paintcomponent(graphics g) {... g2d.setcolor(color.green); g2d.fill(new Rectangle(100, 100, 200, 170)); g2d.setpaint(new GradientPaint(new Point(0,0), Color.blue, new Point(50,50), Color.black, true)); g2d.fill(new Ellipse2D.Double(500, 250, 200, 200));

Piirtopaneeli 1.2 protected void paintcomponent(graphics g) {... g2d.setrenderinghint(renderinghints.key_antialiasing, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setcolor(color.magenta); g2d.setstroke(new BasicStroke(10f)); g2d.drawpolyline(new int[] { 100, 400, 400, 700, new int[] { 400, 400, 100, 100, 4);

Kuvien lataaminen Image-luokka määrittelee geneerisen kuvan. Tällainen kuva voidaan antaa Graphics-oliolle piirrettäväksi. Image tausta =... Java-API on uskomattoman sekava kuvien lataamisen suhteen. Erilaisia tapoja on jopa kymmeniä. tausta = ImageIO.read(new File(...)); Hyvä yleiskäyttöinen kuvanlatausmekanismi on ImageIO.read(File), joka tukee useita kuvaformaatteja.

Kuvien (ja kuviin) piirtäminen Graphics2D tarjoaa monipuoliset työkalut kuvien piirtämiseen. g2d.drawimage(image, x, y, null); Kuvienpiirtämismetodien viimeistä parametria, ImageObserver-oliota, käytetään harvoin applettien ulkopuolella. BufferedImage kuva = ImageIO.read(...); Graphics2D g2 = kuva.creategraphics(); Kuvaan voi piirtää samalla tavalla kuin JPaneliinkin sillä erotuksella että kuvaan piirretyt asiat jäävät talteen.

Piirtopaneeli 1.3 private Image tausta; public Piirtopaneeli() { try { this.tausta = ImageIO.read(new File("atmosphere.jpg")); catch (IOException e) { e.printstacktrace(); System.exit(1); protected void paintcomponent(graphics g) { g2d.drawimage(tausta, 0, 0, null);... g2d.fill(new Ellipse2D.Double(...));

Liikkuva kuva Olioihin perustuvasta piirtämisestä on se etu, että voimme muuttaa mallia ja pitää piirtokoodin muuttumattomana. private Ellipse2D ellipsi; private void paivita() { this.ellipsi.x -= 2; g2d.draw(this.ellipsi); Todellisissa ohjelmissa piirrettävien asioiden mallit kannattaa yleensä erottaa omaan luokkaansa.

Päivityssykli paintcomponent-metodissa kerroimme Swingille, miten haluamme paneelimme piirrettävän. Emme ottaneet kantaa siihen, kuinka usein piirtäminen tapahtuu. public void actionperformed (ActionEvent e) { paivita(); repaint(); Swing ei automaattisesti päivitä komponenttien ulkoasua sen muuttuessa, vaan siitä on komponentin tekijän huolehdittava itse. Kutsumalla komponentin repaint()-metodia pyydämme Swingiä piirtämään komponentin uudestaan. Swing tottelee kun ehtii.

Piirtopaneeli 2.0 public Piirtopaneeli() { Timer ajastin = new Timer(10, new ActionListener() { public void actionperformed(actionevent e) { Piirtopaneeli.this.paivita(); Piirtopaneeli.this.repaint(); ); ajastin.start(); private void paivita() { ellipsi.x -= 2; if (ellipsi.x < -ellipsi.width) { ellipsi.x = getwidth();

Animaatio kuvat = new ArrayList<Image>(); int i = 1; while (new File("frame-" + i + ".png").exists()) { try { kuvat.add(imageio.read(new File("frame-" + i + ".png"))); catch (IOException e) { e.printstacktrace(); System.exit(1); i++; Mitä tässä tapahtuu?

Piirtopaneeli 3.0 private int indeksi; private void paivita() {... if (indeksi < kuvat.size()-1) { indeksi++; else { indeksi = 0; protected void paintcomponent(graphics g) {... g2d.drawimage(kuvat.get(indeksi), 600, 50, null);

Optimoinnin säännöt 1. Älä tee sitä! Koodista tulee helposti sekavaa 2. Älä tee sitä vielä! Optimoi vasta kun koodi toimii

Jos on pakko... 1. Optimoi algoritmia (älä syntaksia) Piirrä vain tarvittaessa Esim. dirty rectangles 2. Älä luule optimoinnin toimivan Testaa, paljonko aikaa koodin suorittamiseen kuluu

Kokeilkaa itse!