1.18k likes | 1.35k Views
Ohjelmointiprojekti I (2 ov) kevät 2003. Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö. Kurssin sisältö. Appletit toimintaympäristö, filosofia erot Java-ohjelmaan (application) rajapinnan metodit grafiikka www:n käyttö rajoitukset. Kurssin sisältö. Tiedostojenkäsittely
E N D
Ohjelmointiprojekti I (2 ov)kevät 2003 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö
Kurssin sisältö • Appletit • toimintaympäristö, filosofia • erot Java-ohjelmaan (application) • rajapinnan metodit • grafiikka • www:n käyttö • rajoitukset
Kurssin sisältö • Tiedostojenkäsittely • erilaiset tiedostot • olioiden sarjallistaminen • tiedostojen käsittelyyn tarvittavat luokat • erilaisia apuluokkia tekstin käsittelyyn • Poikkeustenkäsittely • Poikkeusten käyttötarkoitus • Poikkeusten toiminnan rakenne • Omien poikkeusten määrittely
Kurssin sisältö • Javadoc-dokumentointi • Javan dokumentoinnin rakenne • Javadocin tagien muoto • Javan dokumentoinnin käytännöt • Tapahtumankäsittely • Javan komponenttien rakenne • Komponenttien kommunikointi • Käyttöesimerkki
Appletit • Appletit eivät ole itsenäisiä ohjelmia • WWW-sivulla kerrotaan, että halutaan ladata appletti • Selain käynnistää virtuaalikoneen, jonka sisällä appletti pyörii • Appletti ei näe selaimen ulkopuolelle, se voi käyttää vain selaimen palveluja • Selain tarkistaa appletin oikeellisuutta • Appletti voi sisältää monta luokkaa
Selain • Kuva selaimen ja appletin suhteesta Selaimen palvelut Virtuaalikone -Käynnistää virtuaali- koneen tarvittaessa -Kuuntelee virtuaali- koneen pyyntöjä -Toteuttaa ne, jos ne eivät riko turvalli- suusmääräyksiä ja ne on selaimessa määritelty -Pyörittää applettia -Pyytää selaimelta palveluja -Saa selaimelta palvelujen tulokset -Ei voi viitata virtu- aalikoneen ”hiekka- laatikon” ulkopuolelle Pyynnöt Vastaukset
Appletin käynnistäminen www-sivulta <applet code=”sovelma.class” CODEBASE=”http://www.appletti.fi/a/” WIDTH=250 Height=70> <PARAM name=”etu” value=”Paavo”> <PARAM name=”suku” value=”Väyrynen”> </applet>
Erot Java-sovelluksiin (application) • Appletit eivät ole itsenäisiä ohjelmia, vaan ne vaativat selaimen toimiakseen • Appleteista puuttuu Main-metodi • Appletit on tarkoitettu ladattavaksi verkon yli, niissä pyritään keveyteen • Appletit perivät Applet-luokan ”public class LuokanNimi extends Applet” • Appleteissa ei ole konstruktoria • Appletit toimivat aina graafisesti
Turvallisuusrajoitukset • Tiedostoja ei voi lukea isäntäkoneelta • Verkkoyhteyden voi ottaa vain samalle palvelimelle, josta appletti ladattiin • Ei voi käynnistää ohjelmia isäntäkoneelta • Ei voi tutkia isäntäkoneen ominaisuuksia • Ei voi käynnistää natiivimetodeja • Voi käyttää vain selaimen virtuaalikoneen palveluja, ei muiden osapuolten java-pakkauksia
Applet-luokasta periytyvät metodit init() • Appletin alustus, muuttujien alustus start() • Selain kutsuu tätä metodia kun suoritus alkaa stop() • Selain kutsuu tätä metodia, kun suoritus keskeytyy destroy() • Varattujen resurssien tuhoaminen juuri ennen appletin suorituksen lopettamista
getParameter(String param) • Hakee HTML-sivun parametrin param arvon getDocumentBase() • Palauttaa HTML-sivun hakemiston URL:n getCodeBase() • Palauttaa URL:n hakemistoon, josta appletin tavukoodi on ladattu paint(Graphics g) • Appletin piirtävä metodi
getImage(URL url) • Lataa kuvan osoitteesta url getAudioClip(URL url) • Lataa äänitiedoston osoitteesta url play(URL url) • Soittaa äänitiedoston osoitteesta url
import java.awt.Graphics; import java.applet.*; public class Appletti extends Applet{ public void paint (Graphics g) { g.drawString(getParameter("etu"),10,10); g.drawString(getParameter("suku"),10,20); } }
import java.awt.Graphics; import java.applet.*; public class Initialisoitu extends Applet{ String teksti; public void init() { teksti="On käynnistetty."; } public void start() { teksti=teksti+" Ja taas."; } public void paint (Graphics g) { g.drawString(teksti, 10,10); } }
Appletti ja grafiikka • Appletti on täysin graafinen olio • Kaikki tulokset täytyy näyttää graafisesti • Appletviewer kykenee näyttämään System.out.println()-tulostuksia komentorivi-ikkunassa • Jotta voisi käyttää appletteja, täytyy hallita ainakin alkeet grafiikan tekemisestä appleteilla
Grafiikan perusteet Appletilla • Kaksi tapaa: AWT ja Swing • AWT on vanhempi, mutta laajalti käytössä • AWT on yksinkertaisempi • AWT riittää hyvin appletteihin, jotka eivät ole valtavan monimutkaisia • Swing käydään läpi APSK-kurssilla • Luokka Applet kuuluu AWT:hen • Swingiin liittyy luokka JApplet
Appletti Komponentti 2 Kompo-nentti 1 Komponentti 3 • Applet luokka toimii komponenttisäiliönä • komponentit ovat käyttöliittymän elementtejä • säiliöön voi lisätä ja poistaa komponentteja • säiliöön voi asettaa layout-managereita • komponentit on esitelty omissa luokissaan
Component on yläluokka kaikille komponenteille. • Button tavallinen painonappi, joka laukaisee toimenpiteen • Canvas piirtopinta • CheckBox valintaruutu • Choice pudotusvalikko • Label tekstilaatikko • List vyörytyslista • ScrollBar liu’utin
TextComponent luokka tekstin lukemiseen ja näyttämiseen. Tämä jakaantuu kahteen: • TextArea monirivinen tekstikenttä • TextField yksirivinen tekstikenttä • Container on komponenttisäiliö. Nämä eivät itse näy, mutta ne sisältävät lisää säiliöitä • Panel perussäiliö. Näitä on usein monta yhdessä ruudussa. Niiden avulla voi vaikkapa ryhmitellä eri komponentteja yhdeksi ryhmäksi.
Applet sisältää yhteistoiminnallisuuden selainten kanssa. Appletilla on piirtopinta, johon voidaan suoraan piirtää. Applettiin laitettavat muut komponentit tulevat tämän piirtopinnan päälle. • ScrollPane kiinteän kokoinen alue, johon voi laittaa skrollit, kun sisältö ei enää mahdu piirtoalueelle. • Window päätason säiliöluokka. Sisältää osanaan muut komponenttisäiliöt. • Dialogit luovat valmiin sapluunan yksinkertaiseen kommunikointiin käyttäjän kanssa.
Frame Window:n alainen luokka, joka tulee koko ikkunan ja komponenttisäiliöiden väliin. Tässä on jo otsikko ja menut.
Toimintaperiaate • Joko piirretään suoraan Appletin piirtopinnalle, jos appletti on yksinkertainen, tai • Sijoitetaan komponentit applettiin, ja laitetaan komponentteihin halutut tiedot • komponenteissa on metodit, joiden avulla niiden tilaa muutetaan tai tutkitaan
Appletin piirtopinnalle piirtäminen • Ylikirjoitetaan paint-metodi • Käytetään Graphics-luokan metodeita: drawImage(Image img, int x, int y, ImageObserver observer) • piirtää ladatun kuvan (Image) paikkaan (x,y) drawLine(int x1, int y1, int x2, int y2) • piirtää viivan (x1,y1) -> (x2,y2) drawOval(int x,int y,int width,int height) • Piirtää ovaalin paikkaan (x,y), leveys on width ja korkeus height
drawPolygon(int[] xPoints,int[] yPoints, int nPoints) • piirtää polygonin drawPolyline(int[] xPoints, int[] yPoints,int nPoints) • piirtää murtoviivan drawRect(int x,int y,int width,int height) • piirtää suorakulmion drawString(String str,int x,int y) • piirtää tekstiä annettuun paikkaan
getClipBounds() • palauttaa viittauksen piirtoalueen kokoon. getClipBounds().width palauttaa piirtoalueen leveyden ja .height korkeuden setColor(Color c) • Vaihtaa piirtovärin. Käyttö esim. setColor(Color.black) tai setColor(new Color(0,15,200))
Fontin käyttö: setFont(Font f) • asettaa fontin. Esim. setFont(new Font("TimesRoman",Font.BOLD, 36)) • luokka Font määrittelee fontin.
Skaalaus • Usein tulee tilanne, että piirrettävää kuviota pitää skaalata siten, että se täyttää aina kulloisenkin piirtotilan • Esim. viiva piirretään määrätyistä koordinaateista määrättyihin koordinaatteihin • getClipBounds-metodilla saadaan piirtoalueen koko
Esim. • Ajatellaan, että ruutu on 100*100 pikseliä • Pitää piirtää suorakulmio, jonka vasen ylänurkka on pisteessä (10,10) ja oikea alanurkka pisteessä (90,90) • Halutaan skaalata kuva eri kokoiseksi • xLev=getClipBounds.width • yKor=getClipBounds.height • piirretään g.drawRect((int)0.1*xLev, (int)0.1*yKor, (int)0.9*xLev, (int)0.9*yKor);
Tiedostojen käsittely • Perusyksikkö on tiedosto • Tiedosto koostuu loogisesti yhteenkuuluvista tiedoista • Tiedostot tallennetaan pysyvästi levylle • Levyllä olevat tiedostot sijaitsevat hakemistohierarkiassa • Hakemistot käsitetään Javassa myös tiedostoiksi • Javassa tiedostoa kuvaa luokka File • Appletti ei voi ladata tiedostoja levyltä
File-luokka • Konstruktorit: • File(String pathname) • Luo uuden File-olion, joka viittaa parametrina annettuun tiedostoon • File f =new File(”tiedosto.txt”) • Luo viittauksen tiedosto.txt-tiedostoon oletushakemistossa (suhteellinen osoitustapa)
File f=new File (”\\hakemisto\\tiedosto.txt”) • Windows-tylinen absoluuttinen osoitus. Mainitaan tiedoston koko hakupolku. Tarvitaan kaksi ”\”-merkkiä, koska yksi tunnistettaisiin erikoismerkin edeltäjäksi. • File f=new File (”/hakemisto/tiedosto.txt”) • UNIX (Apple) –tyylinen osoitus • Käytössä olevan hakemistoeroittimen saa selville File.separator • Voi käyttää File f=new File (File.separator+”hakemisto”+ File.separator+”tiedosto”)
Muita metodeja boolean exists() • palauttaa tosi, jos tiedosto on olemassa boolean getAbsolutePath() • palauttaa absoluuttisen polun boolean isFile() • palauttaa tosi, jos tiedosto on tiedosto boolean isDirectory() • palauttaa tosi, jos tiedosto on hakemisto
Muita metodeja boolean delete() • palauttaa epätosi, jos ei onnistunut boolean mkdir() • luo hakemiston, palauttaa onnistuiko canRead() • voiko lukea? canWrite() • voiko kirjoittaa createNewFile() • luo uuden tiedoston
Tiedostovirta • Java-ohjelmat eivät suoraan lue laitteilta • Luodaan virta (stream), joka yhdistää Java-ohjelman haluttuun tiedostoon jollain laitteella Java-ohjelma Levy Tiedostovirta
Tiedostovirtoja käsittelevät luokat voidaan jakaa neljään ryhmään: • InputStream-ryhmän luokat lukevat tietoa tavuittain • OutputStream-ryhmän luokat kirjoittavat tietoa tavuittain • Reader-ryhmän luokat lukevat tietoa merkeittäin • Writer-ryhmän luokat kirjoittavat tietoa merkeittäin
Tiedostoja on kahta päätyyppiä: • tekstitiedosto sisältää tekstimuotoista tietoa, jota voi editorilla muokata. Esim. .java-tiedostot) • binääritiedosto sisältää tietoa ei-tekstimuodossa, sen sisällön voi lukea vain jollain ohjelmalla, joka tätä tietoa tarvitsee. Esim. .class-tiedostot • Ero on siis esitysmuodossa
Tekstitiedosto • Tekstitiedostossa tiedot ovat riveittäin • Rivillä on päätösmerkki (eol (end-of-line)) • Tiedostoa luetaan rivi kerrallaan merkeittäin Binääritiedosto • Sisältää tietoa, jota täytyy lukea tavuittain • Voi olla vaikkapa kuvatiedosto, olioita
Tiedoston avaamisprosessi etenee seuraavasti: • Määritellään tiedosto, jota käytetään • Avataan siihen tiedostovirta • Luetaan (tai kirjoitetaan) tiedostovirrasta sopivalla lukijalla • Sopivan lukijan valinta riippuu luettavasta tai kirjoitettavasta tiedosta
Käsitellään seuraavaksi tekstitiedoston lukemista • Tekstitiedoston tiedostovirta kuuluu Reader-ryhmään • Ryhmän yläluokka on Reader, jonka alaluokkana on mm. BufferedReader
BufferedReader-luokka Konstruktori BufferedReader(Reader in) • Konstruktori vaatii parametrinaan Reader-tyyppisen parametrin, joka edustaa tiedostovirtaa. Reader on itse abstakti luokka, joten se ei käy. Olio-ohjelmoinnin sääntöjen mukaan parametriksi käy myös Readerin perillinen. Sopiva luokka tähän on FileReader. Se luo merkkien lukemisvirran parametrinaan saamaansa File-olioon.
Muita metodeja String readLine() • lukee yhden rivin tekstiä int read() • lukee yhden merkin, jonka palauttaa ilman koodausta kokonaislukuna void close() • sulkee tiedoston
Muita metodeja void mark(long readAheadLimit) • merkitsee kohdan virrassa. Parametri kertoo kuinka monta merkkiä enintään täytyy merkintä muistaa void reset() • palaa edelliseen merkittyyn kohtaan virrassa void skip(long n) • ohittaa seuraavat n merkkiä virrassa
BufferedWriteriä käytetään vastaavasti kirjoittamaan tiedostoon. Sen tärkeimmät metodit ovat: void close() • sulkee tiedoston void flush() • kirjoittaa puskurin sisällön tiedostoon. Tällöin ei ole vaaraa, että tiedot jäävät kirjoittamatta vaikkapa ohjelman kaatumisen takia. void newLine() • rivinvaihto
Muita metodeja void write(String st) • tämä metodi oikeastaan peritään Writer-luokasta. Se kirjoittaa tekstin st tiedostoon ilman rivinvaihtoa. Rivinvaihdon voi kirjoittaa joko käyttämällä newLine-metodia tai kirjoittamalla write(st+”\n”)
Binääritiedoston kirjoittaminen ja lukeminen • Periaatteet ovat samat, käytetään vain eri luokkia • Nämä luokat kuuluvat InputStream ja OutputStream –ryhmiin • Binääritiedostojen lukemisessa ja kirjoittamisessa eteen voi tulla kaksi tapausta: • Halutaan lukea Java-olioita • Halutaan lukea yleistä binääridataa
Tapauksessa 2 voidaan käyttää FileInputStream ja FileOutputStream –luokkia • FileInputStream luokka avaa tiedostovirran tiedostoon. Sen konstruktori on seuraava: FileInputStream(File file) • parametrina annetaan tiedosto file • Luokan metodeja ovat: int read() • palauttaa yhden tavun tiedostovirrasta. Tavu palautetaan kokonaislukuna.
Muita metodeja int read(byte[] b) • lukee b.length tavua taulukkoon b. Tavut ovat muodossa byte. void skip(long n) • ohita n tavua virrassa void close() • sulje lukuvirta
FileOutputStream FileOutputStream(File file) • avaa kirjoitusvirran tiedostoon file FileOutputStream(File file, boolean append) • avaa kirjoitusvirran. Jos append on tosi, lisätään tavut tiedoston loppuun. Luokan metodeja: void write(int b) • kirjoittaa tavun kirjoitusvirtaan
Muita metodeja void write(byte[] b) • kirjoittaa taulukon b kirjoitusvirtaan void close() • sulkee tiedoston void flush() • tyhjentää kirjoitusvirran tiedostoon. Tällöin vältetään tavujen menetys ohjelman kaatuessa.