Javan GUI Scratchaajalle

Samankaltaiset tiedostot
Javan GUI Scratchaajalle

Javan GUI Scratchaajalle

Javan GUI Scratchaajalle

JAVA-OHJELMOINTI 3 op A274615

Osio 4: Graafinen käyttöliittymä

Graafinen käyttöliittymä, osa 3

Olio-ohjelmointi Käyttöliittymä

Sukelluskeräily, Pelihahmon liikuttaminen. Tee uusi hahmo: Pelihahmo. Nimeä se. Testaa ikuisesti -silmukassa peräkkäisinä testeinä (jos) onko jokin

Eclipse & WindowBuilder

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Javan GUI Scratchaajalle

Ohjelmoinnin jatkokurssi, kurssikoe

Jypelin käyttöohjeet» Ruutukentän luominen

Scratch ohjeita. Perusteet

Sukelluskeräily. Pelihahmon liikuttaminen. Aarre ja pisteet

Javan GUI Scratchaajalle

GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING

Osio 4: Graafinen käyttöliittymä

Interaktiivinen tarinankerronta

5. HelloWorld-ohjelma 5.1

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Java ja grafiikka. Ville Sundberg

1. Miten tehdään peliin toinen maila?

NÄIN TEET VIDEO-MAILIN (v-mail)

Graafinen käyttöliittymä, osa 1

kasviin, joka tuottaa hedelmää

Osa 7: Hahmojen ohjelmointi ja hienosäätö

Labyrintti. Pelihahmon toiminta. Piirrä pelihahmo (älä piirrä esim. sivusta, ettei hahmon tarvitse

Microsoft Outlook Web Access. Pikaohje sähköpostin peruskäyttöön

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Rämpytysralli. Pelikehys sisältää GameObject luokan, Scene luokan, SceneManager luokan, InputListener luokan, StaticImage luokan

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Helsingin yliopiston LUMA-keskus

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sen jälkeen Microsoft Office ja sen alta löytyy ohjelmat. Ensin käynnistä-valikosta kaikki ohjelmat

14. Poikkeukset 14.1

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

Muistitikun liittäminen tietokoneeseen

Sähköposti ja uutisryhmät

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

Ohjelmointi 2 / 2010 Välikoe / 26.3

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

9. Periytyminen Javassa 9.1

Kansionäkymä listasta suuriin kuvakkeisiin

GeoGebra-harjoituksia malu-opettajille

Kuvien siirto-ohjelman käyttöohje Huom! Tämä ohjelmisto on käytössä vain yrityksillä, joilla ei ole käytössä Java Runtime 1.4 -sovellusta.

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

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Venekilpailu! Esteiden väistely ja hahmon ohjaaminen

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Febdok 6.0 paikallisversion asennus OHJEISTUS

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

Javan GUI Scratchaajalle

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet, kurssikoe

Poikkeustenkäsittely

FrontPage Näkymät

Kuvien lisääminen ja käsittely

Pedanet oppilaan ohje Aleksanteri Kenan koulu Eija Arvola

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Ohje 1 (12) Maarit Hynninen-Ojala MOODLE PIKAOHJE. Kirjautuminen Moodleen ja työtilan valitseminen

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

SYÖTTÖPOHJA LUKUJEN SYÖTTÖÖN ERI TARKOITUKSIIN

Office 365 palvelujen käyttöohje Sisällys

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Ohje olettaa, että Java on asennettu oletuskansioonsa sekä päivitetty uusimpaan versioonsa ja että selaimen latauskansiona on oletus.

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

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Moodle-oppimisympäristö

Javan perusteita. Janne Käki

Vesisika. metsiemme työmyyrä.

CEM DT-3353 Pihtimittari

Harjoitustyö (TKO_2023)

Rajapinta (interface)

Johdatus ohjelmointiin

15. Ohjelmoinnin tekniikkaa 15.1

Webmailin käyttöohje. Ohjeen sisältö. Sähköpostin peruskäyttö. Lomavastaajan asettaminen sähköpostiin. Sähköpostin salasanan vaihtaminen

Java-kielen perusteita

Tällä harjoituskerralla on tarkoituksena harjoitella käyttötapaus-, luokka- ja tapahtumasekvenssikaavioiden luontia.

ASIO-OHJE HENKILÖSTÖLLE.

SQL Buddy JAMK Labranet Wiki

Ohjelmointityökalu Scratch

Oppilaan opas. Visuaaliviestinnän Instituutti VVI Oy. Versio 0.2 ( )

C# Windows ohjelmointi perusopas

14. Poikkeukset 14.1

Mitä poikkeuskäsittely tarkoittaa?

Ohjelmoinnin perusteet, syksy 2006

JUnit ja EasyMock (TilaustenKäsittely)

Ksenos Prime Käyttäjän opas

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Seilailupeli. Piirrä tausta, mm. liukuvärejä kannattaa käyttää Esteet. Piirrä uusi este-hahmo, joka voi olla esim. jäävuori tai merimiina

ASCII-taidetta. Intro: Python

Testivetoinen ohjelmistokehitys

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

HP ProBook 430 G5 kannettavien käyttöönotto

Kahoot! Kirjautuminen palveluun. Sinikka Leivonen

Transkriptio:

Javan GUI Scratchaajalle Graafisen ikkunan luonti Aiemmin ohjelmoimme luokat ja metodit itse. Graafisia ohjelmia tehdessä kaikkea ei kannata tehdä itse, osan voi ottaa valmiina. Näitä valmishahmoja, eli javaksi olioita, käytetään samoin kuin muitakin tekemiämme olioita. Javassa ikkuna itsessään on myös olio. Vertaa: Olion luonti: Kissa aatu = new Kissa(); Ikkunan luonti: JFrame ikkuna = new JFrame(); eli yhä kirjoitetaan: millainen mikä = mitä(); Ikkunaa luodessa pitää myös: kertoa ikkunan yläpalkkiin nimi.settitle( Haltijapalvelu ); kertoa koko.setsize(400,400); kertoa ohje sulkemiseen.setdefaultcloseoperation(jframe.exit_on_close); kertoa, että ikkuna on näkyvissä!.setvisible(true); valinnainen: myös ikkunan taustavärin voi kertoa.getcontentpane().setbackground(color.black); set = asettaa title = otsikko size = koko default = oletus close = sulkea operation = toimenpide exit = poistua visible = näkyvä true = totta get = saada content pane = sisältöruutu Tehtävä: Haltija_1 Luo uusi java-projekti. Nimi voi olla vaikka Haltijapalvelu. Anna NetBeansin luoda Main Class sen nimisenä kuin se ehdottaa. Pelissä tullaan tekemään haltijoiden tilauspalvelu. Tehtävä: Haltija_2 Luo syntyneen luokan (=tiedoston) main-metodissa ensin uusi JFrame-olio eli ikkuna. NetBeans alleviivaa punaisella edellisen rivin, koska se ei tiedä miten JFrame tehdään. Importtaa JFrame:n teko-ohje tiedoston alussa, ennen public class Haltijapalvelu - riviä: import javax.swing.jframe; Ikkunan luonnin jälkeen anna sille yllä ohjeessa mainitut komennot, jotta se tietää millainen sen tulisi olla. Huomaa, että komennon kirjoittaminen ei nyt riitä vaan se pitää antaa nimenomaan ikkunalle, siis tyyliin näin: ikkuna.settitle( Ikkunan nimi ); Käynnistä peli ja katso, että ikkuna myös syntyy. Huom! Sulje ikkuna, jotta voit testata peliä aina myös uudelleen. Tehtävä: Haltija_3 Muuta ikkunan koon asettavaa komentoa, jotta saat vieressä näkyvän muotoisen ikkunan. Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 1 / 8

Ikkunakomponenttien lisäys Ikkunaan voi lisätä sisältöjä, kuten Scratchissa esiintymislavalle voi lisätä hahmoja. Javassa esiintymislavalle pitää kylläkin antaa myös komento, että sen pitää ottaa hahmo vastaan lavalle. Voisimme tehdä vaikka JLabelin, joka lisätään ( add=lisätä ) lavalle: JLabel etiketti = new JLabel( Lava on huollossa. ); ikkuna.add(etiketti); Jotta ohjelma ymmärtäisi mistä JLabelista ohjelmoija nyt puhuu, pitää tiedoston alussa myös käydä lainaamassa JLabelin (tai muiden esiteltävien luokkien) teko-ohje: import javax.swing.jlabel; JLabel on etiketti, jonka voi liimata ikkunaan. Ikkunaan voi lisätä myös muita komponentteja: Etiketti Nappula Lyhyt tekstikenttä Pitkä tekstikenttä JLabel( Sitruunapippuri ); JButton( Klikkaa tästä. ); JTextField(); JTextArea(); Tehtävä: Haltija_4 1) Kokeile vuorotellen miltä mikin komponentti näyttää ikkunassa. Luo siis ensin komponentti ja käske sitten ikkuna ottamaan se vastaan näkymään. Jos ikkunaan ei tule mitään, raahaa hiirellä se eri kokoiseksi. Java piirtää sen uudelleen. 2) Mitä tapahtuu, jos koitat laittaa ikkunaan kaksi komponenttia yhtä aikaa? 3) Miten lyhyt ja pitkä tekstikenttä eroavat toisistaan? Vinkki: Koita kirjoittaa niihin paljon tekstiä. Kokonaisen kirjaston lainaaminen Äsken jouduit koko ajan pyytämään ohjelmallesi käyttöön eri luokkia, kuten JLabel, JTextField, Jos haluat kerralla pyytää käyttöön vaikka kaikki javan graafiseen käyttöliittymään liittyvät javaxkomponentit, voit kirjoittaa tähden: import javax.swing.*; Muista, että kaikki ohjelman käyttöön otettavat luokat pitää importata tiedoston alussa. Kuvat graafisessa käyttöliittymässä Scratchissa hahmolla on kuva automaattisesti ja sitä voi vaihtaa asusteissa. Javassa asusteellekin pitää tehdä oma hahmo. Tämän hahmon nimi on ImageIcon (=kuvaikoni). ImageIcon kuva = new ImageIcon( Tiedostonimi.png ); Yksi komponentti, joka ymmärtää kuvia on JButton. Kuvan luonnin lisäksi esim. nappulalle pitää myös antaa komento asettaa (=set) kuva käyttöön. komennettavahahmo.seticon(kuva); Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 2 / 8

Tehtävä: Haltija_5 Poista alkuun muut komponentit ikkunasta ja lisää nyt vain yksi JButton, jossa voi lukea vaikka Tilaa haltija. Anna JButton-oliolle fiksu nimi! Pikaisen testin jälkeen lisää nappulalle kuva. - Tee esim. Scratchissa kuva hahmon asusteissa. - Muuta kuva lopuksi bittikarttamuotoon. - Klikkaa hahmoa hiiren oikealla painikkeella ja valitse tallenna paikalliseen tiedostoon. Jos oikealla painikkeella klikkaus ei toimi, paina Shift-näppäin pohjaan ja klikkaa vasemmalla painikkeella. - Tallenna kuva NetBeansProjects -kansion Haltijapalvelu-kansioon. (Ubuntun vieraskäyttäjäksi kirjautuneena se löytyy guest-kansiosta.) Palaa ohjelmoinnin puolelle. Luo ImageIcon -hahmo ja komenna JButton -nappulaa asettamaan se kuvaksi. Muuta ikkunan koko uuteen kuvaan sopivaksi ohjelman koodissa. Bonus: Haltija_6 Saatoit äsken luoda yhdellä rivillä kuva-hahmon ja käskeä nappulan toisella rivillä ottamaan se vastaan. Tämä ei ole välttämätöntä. Jos kuva vain kerran annetaan nappulalle ja ohjelma ei sen jälkeen välitä kuvasta, voidaan kuva luoda suoraan nappulalle. Kuvalle ei tarvitse tällöin antaa edes nimeä. Luo siis kuva seticon-komennon sulkujen sisällä. Automaattikäynnistys Nyt on kyllä tyhmää, jos ikkunan kokoa pitää aina muuttaa, että se näkyy. Tehdään ohjelmastamme automaattikäynnistettävä eli javaksi Runnable. Ensin meidän pitää tutustua rajapintoihin. Rajapinnat Rajapinnat ovat lupauksia siitä mitä joku hahmo voi tehdä. Esimerkiksi Orava voi luvata olevansa keräilevä tai ohjaaja voi luvata olla avustava. Mikään ei toki estä Oravaa lupaamasta moniakin asioita. Se voi olla keräilevän lisäksi avustava. Lupaukset pitää kuitenkin määrittää tietokonetarkasti: - minkä nimisen komennon hahmo ymmärtää - mitä taustatietoja komentoon on määritelty - mitä komento palauttaa - voiko kuka vain antaa komennon vai vain hahmo itse, eli: public / private Haltijapalvelussamme haluamme seuraavaksi tehdä Ikkunan, joka lupaa olevansa ajettava eli Runnable. Tämä luvataan näin: public class Ikkuna implements Runnable { Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 3 / 8

! Versio 1.2 Javan GUI Scratchaajalle 2 - Ikkuna Tyhjä lupaus ei tietokoneelle riitä. Runnable-lupaukseen on määritelty, että lupauksen tekevän luokan pitää sisältää run -komento: public void run() { Mitä komennossa tehdään ei run -komentoa kiinnosta, mutta me haluamme luoda siinä ikkunan. Tehtävä: Haltija_7 Luo projektiin uusi Ikkuna -luokka, joka lupaa olevansa Runnable. Tee sille run -metodi. Kun koodissa ei ole punaisia alleviivauksia, siirrä koko graafisen ikkunan luonti Haltijapalvelu-luokan main - metodista tämän uuden luokan run -metodin sisään. Lopputuloksen pitäisi näyttää noin tältä -> Nyt ohjelma ei toimi, koska Haltijapalvelu ei käynnistä Ikkuna-luokkaa. Jatketaan siis materiaalissa eteenpäin. SwingUtilities SwingUtilities on luokka, joka osaa mm. käynnistää luotettavasti graafisia käyttöliittymiä, jotka sisältävät Runnable -lupauksen run -metodin. Tyypillisesti olemme tehneet aina uuden (=new) kloonin eli olion, kun olemme tehneet esim. JFrameja, JButtoneita ja ImageIconeita. SwingUtilities on kuitenkin staattinen luokka eli se lymyilee aina lähistöllä ja odottaa, jos sille tulisi komentoja. Sille voi siis antaa komentoja ihan vain mainitsemalla ensin sen nimen: SwingUtilities. Kuvitellaan, että olemme luoneet Esiintymislava -luokan, joka on Runnable: public class Esiintymislava implements Runnable { //tänne on ohjelmoitu mm. run-metodi Komento, jolla saamme SwingUtilities luokan käynnistämään käyttöliittymämme (main-metodissa): SwingUtilities.invokeLater( new Esiintymislava() ); Tehtävä: Haltija_8 Laita Haltijapalvelu-luokan main-metodin sisään, eli Scratchin vihreän lipun alle, invokelater-komento. Laita käynnistettäväksi sulkujen sisään uusi Ikkuna-klooni. Testaa, että Haltijapalvelu käynnistyy. Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 4 / 8

Kuuntelijat = Listener Nappulan löytyminen ei riitä. Sitä voi painella, mutta mitään ei tapahdu. Javassa meidän pitää lisätä nappulalle kuuntelija, jotta ohjelma ymmärtää, että nappulaa oikeasti pitää tarkkailla. Kuuntelijoita on moneen eri tarkoitukseen, tässä muutama: ActionListener MouseListener MouseMotionListener MouseWheelListener KeyListener ComponentListener Kuuntelee mm. nappuloiden tapahtumia (=action). Kuuntelee hiiren klikkauksia ja hiiren saapumista/ lähtemistä esim. nappulan alueelta. Kuuntelee hiiren liikettä (=motion). Kuuntelee hiiren rullan (=wheel) pyörimistä. Kuuntelee näppäimistöä. (JTextField tai JTextArea eivät tarvitse tätä.) Kuuntelee mm. ikkunan siirtoja. Kuuntelijoiden käyttö Kaikki äsken mainitut kuuntelijat ovat oikeasti vain rajapintoja, eli listoja lupauksista. Jos haluamme oikeasti kuunnella nappulan klikkauksia, meidän tulee tehdä luokka, joka osaa tehdä kaikki ActionListenerin määrittämät lupaukset. 1) Uuden luokan tulee luvata olevansa ActionListener: import java.awt.event.*; public class NappulaKuuntelija implements ActionListener { 2) Uuden luokan tulee myös pitää lupauksensa. ActionListener-lupauksiin kuuluu tällä kertaa vain yksi metodi. Metodin sisällä voi sitten halutessaan suorittaa komentoja. //nappulan klikkaus public void actionperformed(actionevent ae) { Bonus-tietoa: ActionEvent actionperformed (action = toiminto, perform = suorittaa, näytellä) komennon sisällä voi esimerkiksi tulostaa tekstiä System.out.println( Minua klikattiin. ); tai luoda uuden kissan new Kissa( Mauku ). Klikkauksesta syntyvä tapahtuma voi myös ensin kysyä lisää tietoa tapahtumasta. Yllä olevassa esimerkissä actionperformed-metodi saa taustatiedokseen ActionEvent -olion nimeltään ae. (event=tapahtuma) Siltä voi esimerkiksi kysyä klikkauksen parametreja: System.out.println( ae.paramstring() ); Erilaiset kuuntelijat antavat käytettäväksi erilaisia tapahtumia. Esimerkiksi MouseListener - rajapinnan metodit antavat taustatiedoksi MouseEvent -olion. MouseEvent -oliolta voi pyytää mm. hiiren sijaintia suhteessa kuunneltavaan komponenttiin tai onko vaikka Shift-painettuna, jolloin hiiren klikkaus voi tarkoittaa eri asiaa. Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 5 / 8

! Versio 1.2 Javan GUI Scratchaajalle 2 - Ikkuna Tehtävä: Asiakaspalvelu_1 Tee projektiin uusi luokka. Sen nimi voi olla vaikka TilausKuuntelija. Tehtävä: Asiakaspalvelu_2 Kirjoita luokan määritelmään (public class -rivi), että se lupaa olla ActionListener. Netbeans alleviivaa nyt luokan nimen, koska se ei täytä lupaustaan. Klikkaa hehkulamppua rivin vasemmassa laidassa ja valitse Implement all abstract methods. Poista Netbeansin automaattisesti kirjoittamasta metodista throw new -rivi. Tehtävä: Asiakaspalvelu_3 Jos kuuntelijan metodit ovat tyhjät, ne eivät tietenkään tee mitään vaikka jotakin tapahtumia kuultaisiinkin. Kirjoita actionperformed -metodiin { -sulkujen väliin haluamasi viestin tulostus. Bonus-tietoa: @Override Kun luokkaan kirjoitetaan metodeita, jotka täyttävät rajapinnan määrittämiä lupauksia tai korvaavat jonkun perityn luokan metodin (tästä lisää myöhemmin), niiden alkuun on tapana kirjoittaa @Override -rivi. Sen tarkoitus on muistuttaa ohjelmoijalle, että alla oleva metodi täyttää jonkin lupauksen tai korvaa jonkin aiemman luodun metodin. Bonus-tietoa: throw new Exception Äskeisen tehtävän aikana Netbeans loi tekemiinsä metodeihin throw new UnsupportedOperationException -rivejä. Suora käännös olisi, että java tällöin heittää uuden tukemattoman toimenpiteen poikkeuksen. Ohjelmaa suoritettaessa välillä syntyy virheitä vahingossa, mutta niitä voi myös tarkoituksella luoda, tai siis heittää kuin kapuloita rattaisiin. Aiemmat ohjelmamme ovat usein kaatuneet tällaisiin virheisiin, mutta graafiset käyttöliittymät voivat usein selvitä niistä. Tällöin ne voivat kylläkin olla näkyvissä vaikka jokin niiden sisällä olisikin jo pahasti rikki. Halutessasi voit kokeilla heittää seuraavaa virhettä main-metodin invokelater-komennon jälkeisellä rivillä: throw new NullPointerException("Ähäkutti."); Virheitä voi luoda, mutta ohjelman voi myös ohjelmoida varautumaan niihin. Tähän käytetään trycatch -menetelmää, eli ensin yritetään jotain (try) ja sitten otetaan koppi (catch), jos virhe syntyy. Virheillä on monia erilaisia nimiä, jotta koppia otettaessa erilaiset virheet voidaan ratkaista erilailla. Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 6 / 8

Kuuntelijan lisääminen ohjelmaan Kuuntelijan luokan tekeminen ei riitä. Kuuntelijasta pitää 1) luoda olemassa oleva klooni ja 2) se pitää lisätä jollekin aiemmin luodulle ikkunan komponentille. Esimerkiksi näin: JButton nappula = new JButton( Olen kissa. ); NappulaKuuntelija kuuntelija = new NappulaKuuntelija(); nappula.addactionlistener(kuuntelija); Tehtävä: Asiakaspalvelu_4 Ikkuna -luokassa ikkuna luodaan tällä hetkellä run -metodissa. JButton -nappulan kuvan lisäyksen (seticon) jälkeen luo uusi TilausKuuntelija ja lisää se nappulalle. Tee ja lisää TilausKuuntelija, kuten edellisen esimerkin NappulaKuuntelija. Käynnistä ohjelma ja testaa, että nappulaa klikatessa Netbeansin ohjelmansuoritusriville ilmestyy kuuntelijaan kirjoittamasi viesti. Pop up -viestit Ohjelmien käyttäjät harvoin vilkuilevat konsolista ohjelmien kirjoittamia viestejä. Käyttäjille viestit kannattaakin antaa pop up -ikkunoissa. Erilaisia pop up -ikkunoita: (Ubuntussa ja Windowsissa ikkunat näyttävät erilaisilta) messagedialog = viestivuoropuhelu confirmdialog = vahvistusvuoropuhelu inputdialog = syöttövuoropuhelu Tällaisia pop-up -ikkunoita osaa tehdä JOptionPane. Se on myös staattinen luokka, joka vain lymyää ohjelman lähistöllä, siitä ei tarvitse tehdä oikeaa kloonia, jotta sitä voi komentaa. Yksinkertainen viesti (show = näyttää): JOptionPane.showMessageDialog(null, Haltija saapuu junalla. ); Kaikkiin viesteihin voi myös lisätä otsikon ja viestityypin: JOptionPane.showMessageDialog(null, Haltija matkalla., Toimitus, JOptionPane.INFORMATION_MESSAGE); Viesti Ikkunan otsikko Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 7 / 8

Tehtävä: Asiakaspalvelu_5 Ohjelmoi Tilauskuuntelija -luokkaan, että normaalin tekstin kirjoittamisen sijasta tehdäänkin pop up -ikkuna. Kirjoita haluamasi viesti showmessagedialog -kutsuun. Testaa ohjelman toiminta. Bonus: Asiakaspalvelu_6 Viesti-ikkunan voi ohjelmoida myös niin, ettei alkuperäisessä ikkunassa työskentelyä voi jatkaa ennen kuin viestiin on vastattu. Kun loimme viestin, sille annettiin viesti, mutta myös null. null -viite (=nolla) tarkoitti, ettei viesti-ikkuna tiennyt mihin alkuperäiseen ikkunaan se liittyi. Sen tilalle voitaisiin kuitenkin kirjoittaa myös alkuperäisen ikkunan viite, jolloin se jäätyisi, kunnes vastaus on saatu. Tämän viitteen saa ActionEventilta. Se tietää aina mikä komponentti johti tapahtumaan: public void actionperformed(actionevent ae) { JOptionPane.showMessageDialog( (Component)ae.getSource(), Heipä hei! ); Testaa, että alkuperäinen ikkuna nyt todella muuttuu passiiviseksi kunnes viestiin vastataan. Bonus-tietoa: casting eli muuntelu Edellisen tehtävän getsource (get=saada, source=lähde) -metodi antoi sen objektin, josta tapahtuma syntyi. showmessagedialog -tarvitsi kuitenkin ikkunakomponentin (component) viitteeksi. Onneksi nappulamme oli objektin lisäksi myös ikkunakomponentti, joten pystyimme muuntamaan annetun objektin komponentiksi. (Component) jonkin toisen asian edessä on vähän niin kuin naamiaiset. Toiselle komponentille laitetaan ylle Component-vaate. Tämä ei tietenkään aina toimi, esimerkiksi nappulaamme ei voisi millään tavalla pukea (Kissa) -asusteeseen, koska se ei ole Kissa. Pukeminen on aina mahdollista ohjelmakoodissa, mutta jos yhtä oliota koitetaan pukea vaatteeseen, johon se ei sovi, tulostuu konsoliin ClassCastException (luokan muunto poikkeus) ohjelman ollessa käynnissä. Ohjelma voi kaatua virheeseen tai vähintään alkaa toimia oudosti. Tämän johdosta luokkia muunnellessa tulee aina olla hyvin varma tekemisistään ja ohjelmaan on ehdottoman hyvä tällöin lisätä myös virheenkäsittely. Lisenssi: CC BY-NC-SA Tekijänä: Jenna Tuominen 8 / 8