Java ja JBuilder

Markku Lehtinen

14.11.1997

Ohjelmistotekniikan seminaari

Jyväskylän yliopisto
Matematiikan laitos


Tiivistelmä: Tämä seminaariesitelmä on lyhyt johdanto Java-kieleen ja sovellusten tekemiseen Borland JBuilder 1.0:lla. Esitelmässä esitellään eri Java-komponenttien käyttöä ja hieman Java-ohjelmien siirtoa eri järjestelmiin. Loppuosassa esitetään Java-kielen erityispiirteitä.

Sisällys:

1. Johdanto

Tämä esitelmä on lyhyt johdanto Java-kieleen ja sovellusten luomiseen Borlandin JBuilder 1.0:lla. Pääpaino esityksessä on ennenkaikkea käytännönläheisyydessä, jotta lukijalla olisi mahdollisuus päästä mahdollisimman helposti tutuksi Java-kielen kanssa. Tavoitteena on herättää lukijan mielenkiinto asiaa kohtaan ja tarjota perustiedot omia jatkotutkimuksia varten.
Java on saavuttanut suurta suosioita erityisesti verkko-ohjelmointiin sopivana ja laitteistoriippumattomana kielenä. Java on hyvin kunnianhimoinen yritys luoda uusi ohjelmointikieli, joka olisi yhtä aikaa sekä laitteistoriippumaton, hyvin hajautettava, turvallinen ja vielä helppokäyttöinen. Varsin monia lupauksia Java onkin jo lunastanut, mutta kehitystyötä on vielä tehtävä runsaasti.
Toisen luvun alussa rakennetaan malliohjelma, joka havainnollistaa graafisen käyttöliittymän eri osatekijöiden suunnittelua JBuilderillä. Päätarkoituksena on esitellä ohjelman suunnittelua ja toteutusta helposti ja nopeasti. Malliohjelmaa jatkokehitetään lisäämällä siihen uusia osia, kuten omia komponentteja, menuja, sekä valmiita ja itsetehtyjä dialogeja. Luvun loppuosassa selvitetään hieman, kuinka Java-ohjelmia voidaan siirtää järjestelmästä toiseen.
Kolmannessa luvussa selvitetään Java-kielen perusominaisuuksia, kuten parametrien välitystä, silmukoita, taulukoita, luokkia. Säikeiden käyttöä havainnollistetaan graafisella sovelluksella.
Tämä esitys on rakenteeltaan samanlainen kuin Vesa Lappalaisen "Delphi pikakurssi". Tarkoituksena onkin, että tämän esityksen rinnalla luettaisiin ko. teosta.
Esityksessä käytetyt ohjelmaesimerkit ja tiedostot on saatavilla osoitteesta http://www.jyu.fi/~majole/java

2. Malliohjelma

Tämän luvussa on hieman yleistä asiaa Jbuilderista. Pääasiana on rakentaa ensimmäisen malliohjelma, joka sisältää graafisen käyttöliittymän peruskomponentit. Lisäksi esitellään Applet-tyyppinen Java-ohjelma ja käsitellään hieman ohjelmien siirtoa eri järjestelmiin.

2.1 Yleistä JBuilderistä

JBuilder on visuaalinen Java-kielen sovelluskehitin. Se on käytön kannalta varsin yhdenmukainen Borlandin muiden visuaalisten sovelluskehittimien, kuten Delphin ja C++Builderin kanssa. Ohjelman ulkoasun suunnittelu tapahtuu samalla tavalla asettelemalla komponentteja lomakkeille. Javassa komponentit ovat JavaBeaneja, joiden käsittely on hyvin pitkälle samanlaista kuin Delphin komponenttien. Tässä esityksessä käytetäänkin näitä sanoja lähes synonyymeinä.
JBuilder 1.0:ssa on vähemmän valmiita komponentteja kuin esim. Delphissä. Koodin organisointi ja synkronointi on varsin kehittynyttä, tosin hyvin yksinkertainen leikekirjatoteutus hankaloittaa kehitystyötä. JBuilder 1.0 käyttää JDK (Java Developer Kit) 1.1-versiota, joten sillä tuotetut ohjelmat eivät pyöri ympäristöissä, joissa on käyttössä JDK 1.0-versio.

Kuva 2.1. JBuilderin käyttöliittymä esimerkkiohjelman suunnittelussa.

2.2 Autolaskuri

Ensimmäisenä malliohjelmana teemme "autolaskurin" (kuva 2.2). Sen kahta nappia painamalla voi lisätä joko henkilöautojen tai kuorma-autojen lukumäärää.

Kuva 2.2. Autolaskuri.

2.2.1 Uuden sovelluksen luominen

Ensimmäiseksi luodaan perustiedostot sovellusta varten.

2.2.2 Nappuloiden lisääminen

Nyt voidaaan alkaa sunnitella soveluksen ulkoasua.

2.2.3 Laskuriruutujen lisääminen

2.2.4 Talletus

2.2.5 Kääntäminen ja ajaminen

Ohjelma on nyt toimintakuntoinen, mutta se ei vielä voi tehdä mitään. Voimme kuitenkin kokeilla miltä valmis ohjelma näyttäisi:

2.2.6 Ohjelmakoodin lisääminen

Koko ajan, kun komponentteja on aseteltu lomakkeelle, on JBuilder lisännyt ohjelmakoodia LaskuriFrame-luokkaan (class) tiedostoon LaskuriFrame.java. Tästä LaskuriFrame-luokasta luodaan olio Autolaskuri.java-tiedoston Autolaskuri-luokassa. Painikkeiden toiminnallisuutta vastaavan koodin lisääminen on ohjelmoijan tehtävä. Onneksi JBuilder tekee tästäkin suurimman osan:

2.2.7 Valmis ohjelma

Seuraavana vielä listaukset valmiin malliohjelman tiedostoista hakemistossa autol (autolaskuri.jpr ei ole mukana). Ensimmäisenä on JBuilderin luoma projektin kuvaus.

Autolaskurin pääluokka sijaitsee autolaskuri.jpr-tiedostossa, jossa on myös main-metodi.

LaskuriFrame.java-tiedostossa on varsinainen graafinen toteutus. Seuraavassa lomakkeen listauksessa värilliset osat ovat niitä, joita on muutettu AppBrowserissa. JBuilderissä ei ole erikseen resurssitiedostoja, vaan kaikki komponenttien ominaisuudet asetetaan ja luetaan omilla metodeillaan.

Tehtävä 2.1 Polkupyörät
Lisää ohjelmaan myös polkupyörien laskeminen.

2.3 Muita komponentteja

Javassa Delphin ja C++Builderin komponetteja vastaavat JavaBeanit. JBuilderissa ei kuitenkaan ole valmiina niin laajaa komponenttikirjastoa kuin esim. Delphissä. Sen sijaan omia beaneja on varsin helppo luoda JBuilderin tarjoamilla työkaluilla. Seuraavissa esimerkeissä käytetään itsetehtyjä beaneja, koska vastaavia toimintoja ei voi JBuilderissä niin yksinkertaisesti ja havainnollisesti toteutettaa kuin tässä luvussa on tarkoituksena. Seuraavia toimenpiteitä varten tarvitaan omat.jar-niminen tiedosto, joka sisältää nämä beanit. Tämän tiedoston voit hakea esitelmän johdannossa mainitusta paikasta. Lisäksi tarvitset auton kuvaa varten tiedoston hauto.gif. Kopioi auton kuva projektitiedostoon ennen seuraavaa vaihetta.

2.3.1 Itsetehdyn beanin lisääminen työkaluvalikkoon

2.3.2 TimerBean - ajastetut tapahtumat

Lisätään lomakkeelle vaikkapa aluksi auton kuva, joka ajaa ruudun vasemmasta laidasta oikeaan laitaan.

2.3.3 Menut

Lisätään ohjelmaan vielä päämenu.

2.3.4 Valmiit lomakkeet

JBuilderissä on valmiina joukko yleisimpiä dialogeja, kuten tiedostodialogi, fonttien valinta, värin valinta, sekä viestidialogi.

Lisäämme seuraavaksi mahdollisuuden taustavärin vaihtamiseksi.

Tehtävä 2.3 Muidenkin komponenttien värin vaihto
Muuta ohjelmaa siten, että voit muuttaa kaikkien muidenkin komponenttien värin (voit käyttää samaa dialogia kaikille komponenteille).

2.3.5 Omat dialogit

Oikeassa ohjelmassa on harvoin vain yksi ikkuna. Lisäämme esimerkin vuoksi vielä ohjelmaamme itse tehdyn About-dialogin (About-dialogin saisi tehtyä myös automaattisesti):



Tehtävä 2.4 Modaalinen dialogi
Muuta koodi AboutDialog aboutDialog = new ... muotoon

Mitä eroa on nyt ohjelman toiminnassa?

Tehtävä 2.5 Liikkuva auto myös toisessa dialogissa
Lisää liikkuva auto myös About-dialogiin.

2.4 Ohjelmakoodin korjailu

JBuilderissä on varsin kehittynyt ohjelmakoodin editointijärjestelmä. Seuraavassa muutamia piirteitä:

2.5 Muut tapahtumat

2.5.1 Saman tapahtuman käyttö toisessa komponentissa

Tapahtuman käsittelijän koodi on voitu kirjoittaa tuplaklikkaamalla komponenttia. Näin voidaan kirjoittaa kuitenkin vain komponentin oletustapahtuman käsittelijä. Kullakin komponentilla on lukuisia muitakin tapahtumia. Nämä muut tapahtumat löytyvä Component Inspectorissa Events-sivulta. Kuvassa 2.3 on esimerkki buttonControlHA:n mahdollisista tapahtumista:

Kuva 2.3 Events-sivu

Tapahtuman nimi päästään kirjoittamaan tuplaklikkaamalla tapahtuman nimen paikkaa (tai siinä jo olevaa nimeä). Itse koodia päästään lisämään tuplaklikkaamalla toisen kerran tai painamalla enter. Tapahtumakäsittelijä voidaan asettaa myös samaksi komponentin jonkin toisen tapahtuman kanssa, jolla on sama tapahtumatyyppi (esim. molempien tyyppi on mouseEvent).

Tehtävä 2.6 Laskenta tapahtumaan myös laskurista
Muuta ohjelmaa (kirjoittamatta lisää koodia) siten, että myös laskurikentän LabelHA tai LabelKA painaminen lisää vastaavaa laskuria. Laita vielä liikkuvan kuvan painaminen lisäämään henkilöautojen lukumäärää (joudut hidastamaan ajastinta melko paljon, että viesti ehtii mennä perille).

2.5.2 Vedä ja pudota (drag and drop, DaD)

Javan luokkakirjastoon on määritelty myös Drag and drop-tiedonvälityksen, mutta sitä ei ole vielä toteutettu JDK 1.1:ssä

2.6 Applet-tyyppinen Java-ohjelma

Tähän mennessä on saatu aikaiseksi Java-sovellus, joka toimii vain JDK:n mukana tulevan Java-tulkin alaisuudessa. Entäpä, jos halutaan siirtää autolaskuri sellaiseen muotoon, että sitä voidaan ajaa vaikkapa jollain HTML-selaimella. Tätä varten on olemassa Applet-tyyppiset Java-ohjelmat. Tarkastellaan seuraavaksi, kuinka autolaskuri voidaan muuttaa Applet-tyyppiseksi.

2.7 Java-ohjelmien siirtämisestä eri käyttöjärjestelmiin

Java-kielen eräs tärkeimpiä ominaisuuksia on sen käyttöjärjestelmäriippumattomuus. Periaatteessa samat ohjelmat pyörivät eri käyttöjärjestelmissä sellaisenaan. Hankaluuksia saattaa aiheuttaa kuitenkin erilaiset graafiset ympäristöt. Tämän vuoksi Javan perusmäärittelyssä ei ole koordinaatteihin perustuvaa komponenttien käsittelyä, vaan kaikki komponenttien asettelut annetaan järjestelmän tehtäväksi tietyn layoutin mukaan. Tämän esimerkin autolaskurissa on käytetty JBuilderin oletus-layoutia, XYLayoutia, joka ei kuitenkaan sovellu käytettäväksi ohjelmissa, joita halutaan siirtää käyttöjärjestelmien välillä. Tämän tähden XYLayoutia pitäisi käyttää ainoastaan sovelluksen kehitysvaiheessa. Lisäksi luokkakirjastojen siirtäminen tuottaa erilaisia ongelmia ja niihin on kehittetty erilaisia ratkaisuja. Seuraavassa esitellään muutamia tärkeimpiä siirtämiseen liittyviä asioita.

2.7.1 CLASSPATH-ympäristömuuttuja

Java-luokkien käytössä oleellisen tärkeä asia on ympäristömuuttuja CLASSPATH. Sen avulla Java-tulkki osaa paikallistaa tarvitsemansa luokkakirjastot järjestelmästä. Seuraavassa on esimerkki CLASSPATHin käytöstä Windows NT:ssä:

2.7.2 JBuilderin Deployment Wizard

JBuilderillä helpoin tapa siirtää Java-ohjelmia eri järjestelmiin on käyttää Deployment Wizardia.
Ominaisuuksia:

Pakataan autolaskuri jar-tiedostoon:

3. Javan perusominaisuuksia

Tämän luvun pääaiheena on esitellä Java-kielen perusominaisuuksia. Ensin esitellään Javaa lyhyesti. Kielen syntaksia käymme läpi esimerkkiohjelmien avulla. Käsittelemme mm. parametrien välitystä, silmukoita, taulukoita, luokkia ja säikeitä.

3.1 Lyhyt johdanto Javaan

Java on kehitetty C++-kielen pohjalta, joten syntaksiltaan se on sitä hyvin lähellä. Näin on pyritty luomaan tutun oloinen kieli, jossa kuitenkin olisi korjattu C++:n ongelmia. Javalla on mm. seuraavia erityisominaisuuksia:

Aloitetaan rakenteen selvittäminen lyhyellä konsoli-esimerkkiohjelmalla, joka lukee kaksi kokonaislukua ja tulostaa niistä suuremman, lukujen keskiarvon ja luvut suuruusjärjestyksessä. Muuttujien arvot vaihdetaan pääohjelmassa, koska Javan parametrien välitys tekee swap-tyyppisen aliohjelman hankalaksi toteuttaa (ks. parametrien välitys esimerkkiä).

Java-ohjelman rakenteen tärkeimpiä ominaisuuksia:

3.2 Parametrin välitys

Edellisen esimerkin aliohjelmat on kirjoitettu omaan tiedostoonsa. Tiedoston tulee sijaita projektihakemistossa, josta Java-kääntäjä osaa etsiä sitä automaattisesti tarpeen vaatiessa. Aliohjelmat voidaan määritellä package-käskyn avulla myös yleiskäyttöisiksi aliohjelmakirjastoiksi. Tällöin aliohjelma pitää ottaa käyttöön import-käskyllä pääohjelmatiedoston alussa. Seuraavassa esimerkissä tällä käskyllä otetaan käyttöön Javan syöttöön ja tulostukseen liittyvä aliohjelmakirjasto.

Aliohjelmiin ja parametreihin liittyviä piirteteitä:

3.3 Silmukat ja taulukot

Seuraavassa esimerkissä on ohjelma, joka ensin tekee viisipaikkaisen kokonaislukutaulukon:

0 1 2 3 4
0 3 6 9 12


Ohjelma laskee montako taulukon alkiota voidaan ottaa mukaan, ilman että summa ylittää vielä arvon 10. Lopuksi tulostetaan ko. alkiot takaperin tyyliin



Aliohjelmista ja silmukoista seuraavia havaintoja:

Tehtävä 3.1 swap-funktio taulukon avulla.
Toteuta edellisen esimerkin swap-funktio taulukon avulla (laita parametrit taulukkoon). Onko tämä yhtään parempi ratkaisu?

Tehtävä 3.2 Kaksiulotteiset taulukot.
Muuta ohjelmaa Silmu.java siten, että se toimii kaksiulotteisilla taulukoilla. Toiminta on muuten sama, mutta käytä tiedon varastointiin kaksiulotteista taulukkoa (eli kun yksi taulukon rivi tulee täyteen, aletaan täyttämään järjestyksessä seuraavaa riviä).

3.4 Olio-ominaisuudet

Seuraavassa esimerkissä Oliot.java toteutetaan kuvan 3.1 luokkahierarkia (käytämme unkarilaista nimeämistapaa, missä c=class ja a=abstract).

Kuva 3.1 Esimerkkiohjelman oliohierarkia



Ohjelma tulostaa seuraavaa:

Javassa luokkien käyttöön liittyy seuraavia asioita:

Tehtävä 3.3 Neliö ja suorakaide.
Lisää esimerkkiin luokka cNelio. Entä cSuorakaide?

Tehtävä 3.4 Väri ja suunta.
Mieti miten luokkahierarkiaa muutetaan, mikäli kuvioista halutaan värillisiä ja eri asennossa olevia.

3.5 Säikeet ja dynaamiset kontrollit

Kuva 3.2. SaieFrame.


Javassa määritellään säikeet (threads) kieleen sisäänrakennettuna ominaisuutena. Toteutus tosin voidaan virtuaalikoneessa hoitaa käyttöjärjestelmän säikeillä. Seuraava esimerkki luo DecoratedFrame-ikkunassa (SaieFrame, kuva 3.2) valmiiksi olevan Käynnistä-painikkeen lisäksi joukon laskureita (Label). Kun Käynnistä-painiketta painetaan, käynnistetään kutakin laskuri-kenttää varten oma prosessi (säie), joka pyörittää kentässä lukuja 0:sta ylöspäin. Kenttää painamalla voidaan ko. säie "tappaa". Ohjelmasta on jätetty listaamatta pääohjelma SaieDemo.java sekä tapahtumakäsittelijä omat/adapter/ActionAdapter.java (lisää nämä projektiin ajaaksesi ohjelman).  Javan oma tapahtumakäsittelijöiden toteutus perustuu siihen, että jokaista komponenttia varten luodaan oma tapahtumakäsittelijäluokka, ei pelkästään oliota. Tämä tuottaa runsaasti koodia ja tämä menetelmä ei edes onnistu, kun halutaan luoda dynaamisesti komponentteja ajon aikana. Seuraavassa onkin käytetty itsetehtyä tapahtumakäsittelijää. Se implementoi erilaisia tapahtumia ja kelpaa näin ollen parametriksi eri addXXXListener-funktioille, jotka liittävät komponenttiin tapahtuman tarkkailijan. Kun tarkkailija havaitsee sille sopivan tapahtuman, se lähettää komponentille siitä tapahtumaviestin.

Javan säikeitten käytöstä seuraavia huomioita:

Tehtävä 3.5 Label => Button
Muuta esimerkissä SaieFrame.java laskurikentät nappuloiksi.

Tehtävä 3.6 JBuilderin tapahtumankäsittelijöiden käyttö
Kokeile toteuttaa tapahtumankäsittely käyttäen hyväksi JBuilderin tarjoamia menetelmiä. Missä vaiheessa tulee ongelmia? Mieti eri ratkaisuja.

4. Yhteenveto

Toisessa luvussa rakensimme JBuilderilla yksinkertaisen graafisen mallisovelluksen, jossa työtä oli pyritty yksinkertaistamaan mahdollisimman pitkälle. Todellisessa elämässä tuskin riittävät näin yksinkertaiset toteutukset. Hieman vaativammilla sovelluksilla päästään jo tuntemaan, mitä Java-ohjelmointi on, mitä hyviä puolia on tässä ohjelmointikielessä ja mitä olisi voitu toteuttaa paremmin. Vähitellen selviävät myös, kuinka kielen ominaispiirteitä voi käyttää hyväksi eri tarkoituksiin. Toisaalta selviää myös, mihin Javaa ei kannata käyttää. Laaja perusluokkakirjasto helpottaa ohjelmointityötä, kunhan siihen ensin tutustuu tarpeeksi hyvin.
JBuilder 1.0 jatkaa Borlandin hyvää visuaalisten sovelluskehittimien sarjaa. Graafinen Java-ohjelmointi on pyritty tekemään mahdollisimman selkeäksi ja mukaan on otettu Borlandin varsin kattavan yleiskirjaston lisäksi muutamia muita yleisiä komponettikirjastoja. JBuilder vaatii valitettavasti runsaasti laitetehoa sillä se on toteutettu itsekin Javalla. Kun JBuilderiä vielä kehitetään, siitä saa hyvän työkalun Java-ohjelmointiin.
Tässä työssä ei perehdytty sen tarkemmin eri graafisten elementtien ominaisuuksiin ja käyttöön. Niinikään tietokantaominaisuudet, tietoturva ja verkko-ominaisuudet ohitettiin. JavaBeaneihin päästiin tutustumaan lähinnä käytön kannalta. Näihin asioihin on tarkoitus palata hieman laajemmassa työssä myöhemmin.

Lähteet: