Sovelmat Janne Käki 24.11.2006
Sovellus extends JFrame public static void main(string[] args), joka tyypillisesti vain luo kehysluokan ilmentymän luontimetodi Sovelma extends JApplet ei main-metodia, ei (välttämättä) luontimetodiakaan public void init() - selain kutsuu automaattisesti - alustaa esimerkiksi käyttöliittymän lisäksi: start(), stop(), destroy()
Sovelman ajaminen appletviewer-ohjelmassa tai selaimessa, selaimien ongelmana sovelmakoodin jääminen välimuistiin (muutokset eivät näy ilman selaimen uudelleenkäynnistystä) Molemmat tarvitsevat HTML-sivun, jolle sovelma sijoitetaan Tulostukset ja virheilmoitukset tulevat joko terminaaliin (appletviewerillä) tai ns. Java-konsoliin (selaimella) <html> <head> <title>kolee appletti</title> </head> <body> <table width= 100% 100% height= 100% 100% border= 0 > <tr> <td align= center center valign= middle middle > </td> </tr> </table> </body> </html> <applet code= KoleeAppletti.class KoleeAppletti.class width= 400 400 height= 300 300 > </applet>
Appletviewer Unix-terminaalissa ja Windowsin komentorivillä: appletviewer sivujokasisaltaaappletin.html XEmacsissa:
Java-konsoli
Sovelma vs. sovellus TÄTÄ ET NÄHNYT LUENNOLLA Sovelmalla kiinteä ikkunan koko, sovelluksella joustava Sovelma ei saa kirjoittaa mihinkään tiedostoon, sovellus saa ns. servletit (palvelinsovelmat eli palvelmat )) saavat temmeltää jossain määrin vapaammin Jotkin asiat on tehtävä sovelmissa hieman monimutkaisemmin, esimerkkinä kuvan lataaminen javax.swing.imageicon-olioksi: sovellus ImageIcon kuva = new ImageIcon( mursu.png mursu.png ); sovelma ImageIcon kuva = null; try { kuva = new ImageIcon(this.getImage( new java.net.url(this.getcodebase(), mursu.png ))); } catch (java.net.malformedurlexception e) { e.printstacktrace(); }
Grafiikkaohjelmointi Janne Käki 24.11.2006
Swing-komponentin piirtäminen Jokainen komponentti vastaa siitä, miten se piirretään ruudulle Piirtojärjestelmä vastaa siitä, milloin tämä tapahtuu komponentti.repaint() kutsu tätä tarvittaessa Piirtojärjestelmä korvaa tämä tarvittaessa omalla toteutuksella paintcomponent(graphics g) komponentti.paint(graphics g) paintborder(graphics g) paintchildren(graphics g)
Grafiikkakonteksti java.awt.graphics Mahdollistaa piirtämisen tiettyyn kontekstiin, esimerkiksi näytöllä olevaan paneeliin tai koneen muistissa olevaan kuvaan. paintcomponent-metodi saa tällaisen piirtojärjestelmältä valmiina. Sisältää metodeja, joiden avulla voidaan piirtää mm. viivoja, ovaaleja, monikulmioita, tekstiä sekä muistiin ladattuja kuvia. java.awt.graphics2d Edellisen aliluokka, jossa uusina ominaisuuksina mm. erityisten kuvio- olioiden piirtäminen sekä affiinit koordinaatistonmuunnokset. Jokainen Graphics-olio on yleensä pohjimmiltaan myös Graphics2D-olio.
Piirtäminen tapahtuu metodien avulla: tapahtuu Graphics-luokan perustuu komponentin omaan koordinaatistoon: public void paintcomponent(graphics g) { (0, 0) x super.paintcomponent(g); g.setcolor(this.koleeväri); g.drawoval(-20, -40, 100, 50); g.fillrect(80, 35, 20, 200); g.setcolor(this.getforeground()); g.setfont(this.päheefontti); g.drawstring( hähä hähä,, 10, 150); hähä } g.drawimage(this.kuva, 100, 100, null); y (width-1, height-1) Myös komponentin rajojen ulkopuolelle voi piirtää,, mutta nämä osat eivät näy ruudulla.
Kaksoispuskurointi java.awt.image javax.swing.jpanel Jos komponentti piirretään osissa, piirtämistä ei kannata tehdä suoraan näytölle, vaan koneen muistissa näkymättömissä olevaan kuvaan ( bufferiin( bufferiin ). Valmis kuva piirretään sitten ruudulla näkyvään komponenttiin yhtenä kokonaisuutena, jolloin vältetään kuvan välkkyminen ja eri osien eriaikainen piirtyminen. Swing-komponentit ovat kuitenkin oletusarvoisesti valmiiksi kaksoispuskuroituja. On siis turvallista piirtää suoraan niihin.
Kuvan piirtäminen g.drawimage(image img, int x, int y, ImageObserver obs); Mistä se kuva saadaan? Mitäs laitan koordinaateiksi? Mikä kumma tää nyt sit on? Helpoin tapa: 1. Luo ImageIcon-olio haluamastasi kuvatiedostosta. 2. Kysy Kysy Image Image-olio siltä. On myös muita, vaikeampia tapoja. Komponentin sen pisteen, johon haluat sijoittaa kuvan vasemman yläkulman. Saavat olla myös negatiivisia. Joku, joka odottelee (tarvittaessa) kuvan latautumista muistiin. Jos käytät ImageIcon:ia kuvan hakemiseen, tämä voi hyvin olla null null.
Kuvan piirtäminen Graphics2D:llä g2.drawimage(image img, AffineTransform xform, ImageObserver obs); Mahdollistaa ns. affiinien muunnosten tekemisen piirrettävälle kuvalle. Kuvaa voi esimerkiksi pyöritellä vapaasti. Muunnokset esitetään 3 x 3 -matriisina, java.awt.geom.affinetransform. Ohjelmoijan ei kuitenkaan välttämättä tarvitse juuri vaivata päätään matriisialgebralla riittää, että tietää mitä haluaa (siirtää, kääntää, skaalata, vääntää) ja kuinka paljon :)
Geometriset muunnokset Siirto (translation) Viistoutus (shearing) Kierto (rotation) Skaalaus (scaling) Peilaus (mirroring)
MVC-arkkitehtuurimalli MODEL ohjelman tila visualisoidaan käyttäjälle käyttäjän toimenpiteet muuttavat ohjelman tilaa VIEW CONTROLLER käyttäjä reagoi näkemäänsä käyttöliittymän välityksellä
Graafinen vuorovaikutteinen peli x dsfa y ohjelman tila visualisoidaan käyttäjälle käyttäjän toimenpiteet muuttavat ohjelman tilaa MODEL CONTROLLER VIEW käyttäjä reagoi näkemäänsä käyttöliittymän välityksellä
dsfa x y MODEL VIEW CONTROLLER Pelimaailman malli: paikat, olennot, esineet Pelimaailman (tai sen tietyn osan) visualisaatio Muutoksen aiheuttaja, pelimoottori Muistaa kuka missäkin on, mitä tekemässä, millaisessa kunnossa, ja niin edelleen Piirtää pelin grafiikan (ja toistaa musiikin, ääni- tehosteet, yms.) Kuuntelee pelaajan antamia komentoja ja reagoi niihin Pitää yllä pelaajasta riippumattomia pelitapahtumia