LUKU 17 MUUTAMIA JAVA FX -SOVELLUKSIA. Tässä dokumentissa esitellään muutamia Java FX -sovelluksia.



Samankaltaiset tiedostot
1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

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

HARJOITUKSIA ios-ohjelmointiin LIITTYEN

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

Listarakenne (ArrayList-luokka)

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

JAVA FX GUI -HARJOITUKSET

Olio-ohjelmointi Javalla

Java-kielen perusteet

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

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

JAVA FX GUI -HARJOITUKSET

Metodien tekeminen Javalla

Mikä yhteyssuhde on?

20. Javan omat luokat 20.1

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

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

17. Javan omat luokat 17.1

1 Tehtävän kuvaus ja analysointi

5 Näppäimistö. 5.1 Näppäimistön eventit

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

Rajapinta (interface)

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

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Java-kielen perusteita

Java-kielen perusteet

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Java-kielen perusteita

Ohjelmointi 2 / 2010 Välikoe / 26.3

Java-kielen perusteet

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Java kahdessa tunnissa. Jyry Suvilehto

Muuttujat ja kontrolli. Ville Sundberg

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

Taulukoiden käsittely Javalla

Java ja grafiikka. Ville Sundberg

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

17. Javan omat luokat 17.1

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

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

7. Näytölle tulostaminen 7.1

13. Loogiset operaatiot 13.1

11. Javan valintarakenteet 11.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

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

Harjoitus 2: Oppijan aktivointi ( )

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Luokan sisällä on lista

Sisältö. 2. Taulukot. Yleistä. Yleistä

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

13. Loogiset operaatiot 13.1

Ohjelmoinnin perusteet, kurssikoe

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

RINNAKKAINEN OHJELMOINTI A,

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

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Ohjelmoinnin perusteet Y Python

LUKU 5 MUUTTUJAT JA MUUT JAVA-OHJELMIEN PERUSELEMENTIT. import java.util.* ;

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

8. Näppäimistöltä lukeminen 8.1

ITKP102 Ohjelmointi 1 (6 op)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Osio 4: Graafinen käyttöliittymä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Interaktiivinen käyttöliittymä. 2008

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

CSS-kielen avulla määritellään HTML-dokumentin tyyli. CSS avulla voidaan tarkemmin määritellä eri elementtien ominaisuuksia.

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Javan perusteita. Janne Käki

12. Näppäimistöltä lukeminen 12.1

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

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 )

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Ohjelmoinnin perusteet Y Python

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Ohjelmoinnin perusteet Y Python

1. Omat operaatiot 1.1

Ehto- ja toistolauseet

Rinnakkaisohjelmointi, Syksy 2006

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

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

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

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

C++11 seminaari, kevät Johannes Koskinen

Mitä poikkeuskäsittely tarkoittaa?

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Olio-ohjelmointi Käyttöliittymä

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

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

9. Periytyminen Javassa 9.1

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

8. Näppäimistöltä lukeminen 8.1

Transkriptio:

LUKU 17 MUUTAMIA JAVA FX -SOVELLUKSIA Tässä dokumentissa esitellään muutamia Java FX -sovelluksia. Kaikista sovelluksista esitellään niiden ohjelmakoodi muutamine selityksineen ja lisäksi on kuva kunkin sovelluksen tuottamasta ikkunasta. Alussa, heti seuraavalla aukeamalla, esitellään yksi Java CLI -sovellus, eli ohjelma joka toimii komentorivi-ikkunassa. Viimeisellä sivulla on taulukko Java-kielen muuttujatyypeistä. 2015-10-11 Tiedosto luotu. 2015-10-11 Viimeisin muutos

564 Luku 17: Muutamia Java FX -sovelluksia Tässä esitellään ja luodaan taulukko johon voidaan tallettaa 100 int-arvoa. Taulukko vaatii 400 tavua muistia. luvun_indeksi on muuttuja jota käytetään taulukon indeksoinnissa. Kun luvun_indeksi on alussa arvossa 0, viitataan ensimmäiseen taulukon lukutaulukko paikkaan. // Takaperin.java (c) Kari Laitinen import java.util.* ; Muuttujan luku_nappaimistolta arvo kopioidaan taulukon lukutaulukko siihen positioon jonka määrittää muuttujan luvun_indeksi arvo. Kun muuttujan luvun_indeksi arvoa kasvatetaan tämän käskylauseen jälkeen, seuraava kokonaisluku taulukon seuraavaan paikkaan (positioon). class Takaperin public static void main( String[] ei_kaytossa ) Scanner nappaimisto = new Scanner( System.in ) ; int[] lukutaulukko = new int[ 100 ] ; int luvun_indeksi = 0 ; int luku_nappaimistolta = 0 ; System.out.print("\n Tama ohjelma lukee kokonaislukuja nappaimistolta." + "\n Kun annetaan luku nolla, ohjelma tulostaa luvut" + "\n kaanteisessa jarjestyksessa. Aloita lukujen" + "\n syottaminen ja anna lopuksi nolla.\n\n") ; do System.out.print( " " + luvun_indeksi + " Anna kokonaisluku: ") ; luku_nappaimistolta = nappaimisto.nextint() ; lukutaulukko[ luvun_indeksi ] = luku_nappaimistolta ; luvun_indeksi ++ ; while ( luku_nappaimistolta!= 0 ) ; System.out.print( "\n Luvut takaperin: " ) ; while ( luvun_indeksi > 0 ) luvun_indeksi -- ; System.out.print( lukutaulukko[ luvun_indeksi ] + " " ) ; Tämä while-silmukka tulostaa taulukon sisällön näytölle. Koska muuttujan luvun_indeksi pienenee silmukan sisällä, numerot tulevat tulostetuksi käänteisessä järjestyksessä. Tämä do-while-silmukka päättyy kun käyttäjä syöttää näppäimistöltä nollan. Myös tuo nolla talletetaan taulukkoon. Silmukan toiminnan päättyessä muuttujalla luvun_indeksi on arvo joka kuvaa annettujen ja taulukkoon talletettujen lukujen määrää. Viimeisenä annettu nolla on myös laskettu mukaan tuohon lukujen määrään. do-while-silmukoiden erityispiirre on että ne suoritetaan aina ainakin kerran. Tämä silmukka toimii myös siinä tapauksessa että näppäimistöltä annetaan pelkkä nolla. Takaperin.java - 1.+ CLI-sovellus joka tulostaa annetut luvut käänteisessä järjestyksessä.

565 Kun ohjelman suoritus saapuu tähän silmukkaan, muuttujalla luvun_indeksi on arvo joka kertoo montako lukua taulukkoon on tallennettu. luvun_indeksi viittaa siten ensimmäiseen sellaiseen paikkaan taulukossa johon ei vielä ole talletetuu näppäimistöltä annettua lukua. Tämän vuoksi muuttujan luvun_indeksi arvoa pitää pienentää ennenkuin mitää tulostetaan näytölle. Operaattori -- pienentää muuttujan arvoa yhdellä. Tämä silmukka voitaisiin ilmaista luonnollisella kielellä seuraavasti: "Niin kauan kuin on mahdollista pienentää muuttujan luvun_indeksi arvoa ilman että se menee negatiiviseksi, pienennä sen arvoa, ja tulosta tuolla arvolla yksi luku taulukosta lukutaulukko." while ( luvun_indeksi > 0 ) luvun_indeksi -- ; System.out.print( lukutaulukko[ luvun_indeksi ] + " " ) ; Takaperin.java - 1-1. Silmukka joka tulostaa luvut takaperin. Kolme välilyöntimerkkiä (space characters) tulostetaan erottamaan näytettävät luvut toisistaan.. D:\javaohjelmat2>java Takaperin Tama ohjelma lukee kokonaislukuja nappaimistolta. Kun annetaan luku nolla, ohjelma tulostaa luvut kaanteisessa jarjestyksessa. Aloita lukujen syottaminen ja anna lopuksi nolla. 0 Anna kokonaisluku: 22 1 Anna kokonaisluku: 33 2 Anna kokonaisluku: 444 3 Anna kokonaisluku: 555 4 Anna kokonaisluku: 6666 5 Anna kokonaisluku: 7777 6 Anna kokonaisluku: 88 7 Anna kokonaisluku: 99 8 Anna kokonaisluku: 0 Luvut takaperin: 0 99 88 7777 6666 555 444 33 22 Takaperin.java - X. Tässä ohjelma on suoritettu antamalla sille 9 kokonaislukua.

566 Luku 17: Muutamia Java FX -sovelluksia Tällä ja seuraavalla sivulla esitellään Java FX -sovellus jossa luodaan erilaisia graafisia olioita standardiluokkien Text, Line, Rectangle, Circle, ja Arc avulla. Suorakaidetta määriteltäessä annetaan parametreina suorakaiteen vasemman yläkulman koordinaatit sekä suorakaiteen leveys ja suorakaiteen korkeus. // ShapesDemoFX.java Copyright (c) Kari Laitinen import javafx.application.application; import javafx.scene.scene; import javafx.scene.group; import javafx.scene.text.text ; import javafx.stage.stage; import javafx.scene.shape.* ; import javafx.scene.paint.color; public class ShapesDemoFX extends Application public void start( Stage stage ) stage.settitle( "ShapesDemoFX.java" ) ; Group group_for_shapes = new Group() ; Scene scene = new Scene( group_for_shapes, 896, 512 ) ; scene.setfill( Color.LIGHTYELLOW ) ; Text scene_size_text = new Text( 20, 20, "Scene size is " + (int) scene.getwidth() + " x " + (int) scene.getheight() ) ; Line blue_horizontal_line = new Line( 64, 128, 512, 128 ) ; blue_horizontal_line.setstroke( Color.BLUE ) ; blue_horizontal_line.setstrokewidth( 3 ) ; Rectangle cyan_square = new Rectangle( 64, 192, 128, 128 ) ; cyan_square.setfill( Color.CYAN ) ; Rectangle magenta_rectangle = new Rectangle( 266, 202, 128, 108 ) ; magenta_rectangle.setfill( Color.MAGENTA ) ; Rectangle frame_around_magenta_rectangle = new Rectangle( 256, 192, 148, 128 ) ; frame_around_magenta_rectangle.setfill( Color.TRANSPARENT ) ; frame_around_magenta_rectangle.setstroke( Color.BLUE ) ; frame_around_magenta_rectangle.setstrokewidth( 3 ) ; Circle yellow_ball = new Circle( 512, 256, // center point (512, 256) 64, // radius is 64 points Color.YELLOW ) ; yellow_ball.setstroke( Color.BLUE ) ; yellow_ball.setstrokewidth( 3 ) ; ShapesDemoFX.java - 1: Ohjelma joka demonstroi graafisten olioiden käyttöä.

567 Tässä määritellään Pacman-kuvio jonka suu aukeaa oikealle. Pacmanin pään muoto on ympyrämäinen koska korkeutta ja leveyttä kuvaavat säteet on asetettu samoiksi. Suun määrittävässä koordinaatistossa nolla astetta on idässä ja 90 astetta on pohjoisessa. Arc pacman_shape = new Arc( 704, 256, // center point 64, 64, // width and height radiuses 45, // start angle in degrees 270 ) ; // length angle in degrees pacman_shape.settype( ArcType.ROUND ) ; pacman_shape.setfill( Color.LIGHTGREY ) ; pacman_shape.setstroke( Color.BLACK ) ; pacman_shape.setstrokewidth( 3 ) ; // The 'pie slice' represents the 'missing' part of pacman shape Arc pie_slice = new Arc( 768, 256, 64, 64, 315, 90 ) ; pie_slice.settype( ArcType.ROUND ) ; pie_slice.setfill( Color.LIGHTGREY ) ; pie_slice.setstroke( Color.BLACK ) ; pie_slice.setstrokewidth( 3 ) ; Line black_horizontal_line = new Line( 512, 384, 768, 384 ) ; black_horizontal_line.setstroke( Color.BLACK ) ; black_horizontal_line.setstrokewidth( 3 ) ; group_for_shapes.getchildren().addall( scene_size_text, blue_horizontal_line, cyan_square, magenta_rectangle, frame_around_magenta_rectangle, yellow_ball, pacman_shape, pie_slice, black_horizontal_line ) ; stage.setscene( scene ) ; stage.show(); public static void main( String[] command_line_parameters ) launch( command_line_parameters ) ; Tässä lisätään kaikki luodut graafiset oliot sovelluksen Groupolion lapsilistaan, minkä jälkeen kyseiset oliot tulevat näkyville ikkunaan. Java FX -sovelluksissa käytettävä main()- metodi on näissä esimerkeissä aina samanlainen. Tämän ohjelman tuottama näkymä on esitelty seuraavalla sivulla. ShapesDemoFX.java - 2. Ohjelman loppuosa.

568 Luku 17: Muutamia Java FX -sovelluksia Tämän suorakaiteen (joka on siis neliö) vasen yläkulma on pisteessä (64, 192). Graafisen koordinaatiston nollapiste on ikkunan vasen yläkulma. x-koordinaatti kasvaa oikealle ja y-koordinaatti kasvaa alaspäin. ShapesDemoFX.java - X. Ohjelman tuottama ikkuna.

569 Tällä ja seuraavilla kolmella sivulla esitelty ohjelma demonstroi kuinka Java FX -sovelluksissa reagoidaan erilaisiin hiiritapahtumiin. Näiden DoubleProperty-olioiden arvoja muutetaan silloin kun hiirtä liikutellaan tämän sovelluksen ikkunassa. Ohjelma on rakennettu niin että näiden olioiden sisältämät arvot vaikuttavat näytöllä olevien ellipsien eli soikioiden paikkoihin. // MouseDemoFX.java Copyright (c) Kari Laitinen import javafx.application.application; import javafx.scene.input.* ; // MouseEvent, MouseButton import javafx.scene.* ; import javafx.stage.stage; import javafx.geometry.* ; // Point2D import javafx.scene.paint.color; import javafx.scene.shape.ellipse ; import javafx.beans.property.* ; // DoubleProperty etc. public class MouseDemoFX extends Application Group group_for_ellipses = new Group() ; Ellipse large_ellipse ; Ellipse left_small_ellipse, middle_small_ellipse, right_small_ellipse ; DoubleProperty event_position_x = new SimpleDoubleProperty() ; DoubleProperty event_position_y = new SimpleDoubleProperty() ; public void start( Stage stage ) stage.settitle( "MouseDemoFX.java" ) ; Scene scene = new Scene( group_for_ellipses, 800, 600 ) ; scene.setfill( Color.LAVENDER ) ; // The large ellipse will be in the middle of the Scene at // the beginning. large_ellipse = new Ellipse( scene.getwidth() / 2, scene.getheight() / 2, 80, 105 ) ; // The small ellipses, which represent the mouse buttons, // are defined without a location. left_small_ellipse = new Ellipse( 16, 30 ) ; middle_small_ellipse = new Ellipse( 16, 30 ) ; right_small_ellipse = new Ellipse( 16, 30 ) ; // The small ellipses are not visible when the program starts running. left_small_ellipse.visibleproperty().setvalue( false ) ; middle_small_ellipse.visibleproperty().setvalue( false ) ; right_small_ellipse.visibleproperty().setvalue( false ) ; MouseDemoFX.java - 1: Ohjelma joka demonstroi hiiritapahtumiin reagointia.

570 Luku 17: Muutamia Java FX -sovelluksia Ohjelmassa suuri harmaa ellipsi kuvaa koko hiirtä ja pienet ellipsit kuvaavat hiiren nappeja. Tässä asetetaan DoubleProperty-tyyppisille luokan datajäsenille kuuntelijat. Näiden avulla saadaan hiirtä ja sen nappeja kuvaavien ellipsien paikat muuttumaan silloin kun hiirtä liikutetaan. large_ellipse.setfill( Color.GRAY ) ; large_ellipse.setstroke( Color.BLACK ) ; left_small_ellipse.setstroke( Color.BLACK ) ; middle_small_ellipse.setstroke( Color.BLACK ) ; right_small_ellipse.setstroke( Color.BLACK ) ; // The following statements add listeners which specify how the // ellipses are re-located when the mouse cursor position changes. // The listeners are made with Lambda expressions. event_position_x.addlistener( ( observable_value, value, new_value ) -> large_ellipse.setcenterx( new_value.doublevalue() ) ; left_small_ellipse.setcenterx( new_value.doublevalue() - 40 ) ; middle_small_ellipse.setcenterx( new_value.doublevalue() ) ; right_small_ellipse.setcenterx( new_value.doublevalue() + 40 ) ; ) ; event_position_y.addlistener( ( observable_value, value, new_value ) -> large_ellipse.setcentery( new_value.doublevalue() + 75 ) ; left_small_ellipse.setcentery( new_value.doublevalue() + 35 ) ; middle_small_ellipse.setcentery( new_value.doublevalue() + 25 ) ; right_small_ellipse.setcentery( new_value.doublevalue() + 35 ) ; ) ; group_for_ellipses.getchildren().addall( large_ellipse, left_small_ellipse, middle_small_ellipse, right_small_ellipse ) ; MouseDemoFX.java - 2: Ohjelman jatkoa.

571 Sovelluksen skenen eli käytännössä sen ikkunan taustaväri pannaan erilaiseksi silloin kun hiiri viedään sovelluksen ikkunan päälle. Tässä tallennetaan hiiren kursorin paikan koordinaatit DoubleProperty-tyyppisiin datajäseniin joista ne sitten vaikuttavat hiirtä kuvaavien ellipsien paikkoihin. scene.setonmouseentered( ( MouseEvent event ) -> scene.setfill( Color.LIGHTSKYBLUE ) ; ) ; scene.setonmouseexited( ( MouseEvent event ) -> scene.setfill( Color.LAVENDER ) ; ) ; scene.setonmousepressed( ( MouseEvent event ) -> event_position_x.setvalue( event.getscenex() ) ; event_position_y.setvalue( event.getsceney() ) ; // A small ellipse is made visible when a mouse button is pressed. if ( event.getbutton() == MouseButton.PRIMARY ) // Left left_small_ellipse.visibleproperty().setvalue( true ) ; else if ( event.getbutton() == MouseButton.MIDDLE ) middle_small_ellipse.visibleproperty().setvalue( true ) ; else if ( event.getbutton() == MouseButton.SECONDARY ) // Right right_small_ellipse.visibleproperty().setvalue( true ) ; // The small ellipses will be shown with a different color // if either the Ctrl or the Shift key is pressed down. if ( event.iscontroldown() == true event.isshiftdown() == true ) left_small_ellipse.setfill( Color.MAGENTA ) ; middle_small_ellipse.setfill( Color.MAGENTA ) ; right_small_ellipse.setfill( Color.MAGENTA ) ; else left_small_ellipse.setfill( Color.YELLOW ) ; middle_small_ellipse.setfill( Color.YELLOW ) ; right_small_ellipse.setfill( Color.YELLOW ) ; ) ; MouseDemoFX.java - 3: Hiireen reagoivia Lambda-lausekkeita.

572 Luku 17: Muutamia Java FX -sovelluksia Tässä kaikki hiiritapahtumumiin reagoivat Lambda-lausekkeet kiinnitetään nimenomaan Scene-olioon. MouseEvent-tyyppisestä oliosta voidaan kaivaa tietoa hiiritapahtumaan liittyen. Tässä esimerkiksi otetaan selville mitä hiiren nappia käytettiin. // The following statement specifies the actions when the mouse // is moved without pressing its buttons. scene.setonmousemoved( ( MouseEvent event ) -> event_position_x.setvalue( event.getscenex() ) ; event_position_y.setvalue( event.getsceney() ) ; ) ; // Dragging of the mouse means that it is moved while simultaneously // pressing one or more of its buttons. scene.setonmousedragged( ( MouseEvent event ) -> event_position_x.setvalue( event.getscenex() ) ; event_position_y.setvalue( event.getsceney() ) ; ) ; scene.setonmousereleased( ( MouseEvent event ) -> if ( event.getbutton() == MouseButton.PRIMARY ) // Left left_small_ellipse.visibleproperty().setvalue( false ) ; else if ( event.getbutton() == MouseButton.MIDDLE ) middle_small_ellipse.visibleproperty().setvalue( false ) ; else if ( event.getbutton() == MouseButton.SECONDARY ) right_small_ellipse.visibleproperty().setvalue( false ) ; ) ; stage.setscene( scene ) ; stage.show(); public static void main( String[] command_line_parameters ) launch( command_line_parameters ) ; MouseDemoFX.java - 4. Ohjelman loppuosa.

573 Alla olevassa kuvassa ohjelmaa on suoritettu siten että hiiri on tuotu sovelluksen ikkunaan ja kaikki hiiren napit on painettu yhtäaikaisesti alas. Jos tätä ohjelmaa suoritetaan sellaisessa ympäristössä jossa ei ole käytössä kolmea hiiren nappia (esim. MacOS X), alla olevaa näkymää ei välttämättä saada aikaiseksi. MouseDemoFX.java - X. Ohjelman tuottama ikkuna.

574 Luku 17: Muutamia Java FX -sovelluksia Tällä ja seuraavilla sivuilla esitellään sovellus joka näyttää kolmea palloa ikkunassa, ja noita palloja voidaan liikutella hiiren avulla. Palloa varten on tässä johdettu Circle-luokasta oma luokka nimeltä Ball. Ball-luokan oliot voidaan aktivoida siten että niihin piirtyy paksumpi reuna. // MovingBallsWithMouseFX.java Copyright (c) Kari Laitinen import javafx.application.application; import javafx.event.actionevent; import javafx.event.eventhandler; import javafx.scene.input.mouseevent; import javafx.scene.* ; import javafx.scene.layout.* ; import javafx.stage.stage; import javafx.geometry.* ; // Point2D import javafx.scene.paint.color; import javafx.scene.shape.circle ; import javafx.collections.* ; // ObservableList etc. class Ball extends Circle public Ball( double given_center_point_x, double given_center_point_y, double given_radius, Color given_color ) super( given_center_point_x, given_center_point_y, given_radius, given_color ) ; setstroke( Color.BLACK ) ; setstrokewidth( 2 ) ; public void activate_ball() setstrokewidth( 6 ) ; public void deactivate_ball() setstrokewidth( 2 ) ; public void move_this_ball( double movement_in_direction_x, double movement_in_direction_y ) setcenterx( getcenterx() + movement_in_direction_x ) ; setcentery( getcentery() + movement_in_direction_y ) ; MovingBallsWithMouseFX.java - 1: Ohjelma jonka palloja voi liikutella hiirellä.

575 Tämän foreach -silmukan avulla sovelluksen kaikille palloille määritellään hiireen reagointi. Hiiritapahtumien käsittely kiinnitetään nimenomaan Ball-olioihin. Näin ohjelman ajosysteemi pitää huolen siitä että hiiritapahtuma osuu oikeaan palloon. public class MovingBallsWithMouseFX extends Application static final int SCENE_WIDTH = 800 ; static final int SCENE_HEIGHT = 600 ; boolean ball_movement_going_on = false ; double previous_cursor_position_x, previous_cursor_position_y ; Group group_for_balls = new Group() ; private void set_mouse_activities_for_balls() for ( Node child_in_list : group_for_balls.getchildren() ) Ball ball_in_list = (Ball) child_in_list ; ball_in_list.setonmousepressed( ( MouseEvent event ) -> if ( ball_movement_going_on == false ) ball_in_list.activate_ball() ; previous_cursor_position_x = event.getscenex() ; previous_cursor_position_y = event.getsceney() ; ball_movement_going_on = true ; ) ; ball_in_list.setonmousedragged( ( MouseEvent event ) -> if ( ball_movement_going_on == true ) double mouse_movement_x = event.getscenex() - previous_cursor_position_x ; ) ; double mouse_movement_y = event.getsceney() - previous_cursor_position_y ; previous_cursor_position_x = event.getscenex() ; previous_cursor_position_y = event.getsceney() ; ball_in_list.move_this_ball( mouse_movement_x, mouse_movement_y ) ; MovingBallsWithMouseFX.java - 2: Sovellusluokan alkuosa.

576 Luku 17: Muutamia Java FX -sovelluksia Tässä on edellisellä sivulla alkaneen foreach -silmukan loppuosa. Tässä määritellään mitä tehdään kun hiiren nappi vapautetaan pallon päällä. Ball-oliot luodaan tässä ja ne kiinnitetään heti sovelluksen Group-olion lapsilistaan. ball_in_list.setonmousereleased( ( MouseEvent event ) -> if ( ball_movement_going_on == true ) ball_in_list.deactivate_ball() ; ball_movement_going_on = false ; ) ; public void start( Stage stage ) group_for_balls.getchildren().add( new Ball( SCENE_WIDTH / 4, SCENE_HEIGHT / 2, 64, Color.RED ) ) ; group_for_balls.getchildren().add( new Ball( SCENE_WIDTH / 2, SCENE_HEIGHT / 2, 64, Color.GREEN ) ) ; group_for_balls.getchildren().add( new Ball( SCENE_WIDTH * 3 / 4, SCENE_HEIGHT / 2, 64, Color.BLUE ) ) ; // Now the Ball objects are stored as 'children' of the Group. // The following method call specifies what will happen when // the balls are operated with the mouse. set_mouse_activities_for_balls() ; Scene scene = new Scene( group_for_balls, SCENE_WIDTH, SCENE_HEIGHT ) ; scene.setfill( Color.LIGHTYELLOW ) ; stage.settitle( "MovingBallsWithMouseFX.java" ) ; stage.setscene( scene ) ; stage.show(); public static void main( String[] command_line_parameters ) launch( command_line_parameters ) ; MovingBallsWithMouseFX.java - 3. Ohjelman loppuosa.

577 Alla olevassa kuvassa sovellus on juuri käynnistetty eikä palloja ole liikutettu vielä ollenkaan. MovingBallsWithMouseFX.java - X. Ohjelman tuottama ikkuna.

578 Table 5-1. Java-ohjelmointikielen muuttujatyypit. Tyyppi Muistin määrä Lukualue int 4 tavua 32 bittiä -2,147,483,648... 2,147,483,647-80000000H... 7FFFFFFFH short 2 tavua 16 bittiä -32,768... 32,767-8000H... 7FFFH long 8 tavua 64 bittiä -9,223,372,036,854,775,808... 9,223,372,036,854,775,807-8000000000000000H... 7FFFFFFFFFFFFFFFH byte 1 tavu 8 bittiä -128... 127-80H... 7FH boolean 1 tavu 8 bittiä false tai true char 2 tavua 16 bittiä Unicode 0... 65535 float 4 tavua 32 bittiä Tarkkuus: 7 desimaalista numeroa Alue: +/- 1.5e-45... 3.4e38 a double 8 tavua 64 bittiä Tarkkuus: 15 desimaalista numeroa Alue: +/- 5.0e-324... 1.7e308 muistiosoite b 4 tavua 32 bittiä Riittää osoittamaan 4,294,967,296 tavua (4 gigatavua) keskusmuistia. a. Tässä annetut lukualueet ovat likimääräisiä. b. "muistiosoite" ei ole Javan muuttujatyyppi. Tämä taulukon rivi kertoo kuinka paljon muistia varataan (allokoidaan) silloin kun niin sanottu olioviittaaja esitellään. Olioviittaajat ovat eräänlaisia muuttujia joihin talletetaan heap-muistiin luotujen olioiden osoitteet.