1 / 118

Ohjelmointiprojekti I (2 ov) kevät 2003

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

vian
Download Presentation

Ohjelmointiprojekti I (2 ov) kevät 2003

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ohjelmointiprojekti I (2 ov)kevät 2003 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö

  2. Kurssin sisältö • Appletit • toimintaympäristö, filosofia • erot Java-ohjelmaan (application) • rajapinnan metodit • grafiikka • www:n käyttö • rajoitukset

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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>

  8. 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

  9. 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

  10. 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

  11. 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

  12. getImage(URL url) • Lataa kuvan osoitteesta url getAudioClip(URL url) • Lataa äänitiedoston osoitteesta url play(URL url) • Soittaa äänitiedoston osoitteesta url

  13. 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); } }

  14. 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); } }

  15. 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

  16. 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

  17. 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

  18. AWT:ssa on monta erilaista komponenttia:

  19. 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

  20. 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.

  21. 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.

  22. Frame Window:n alainen luokka, joka tulee koko ikkunan ja komponenttisäiliöiden väliin. Tässä on jo otsikko ja menut.

  23. 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

  24. 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

  25. 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

  26. 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))

  27. Fontin käyttö: setFont(Font f) • asettaa fontin. Esim. setFont(new Font("TimesRoman",Font.BOLD, 36)) • luokka Font määrittelee fontin.

  28. 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

  29. 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);

  30. 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ä

  31. 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)

  32. 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”)

  33. 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

  34. 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

  35. Tiedostovirta • Java-ohjelmat eivät suoraan lue laitteilta • Luodaan virta (stream), joka yhdistää Java-ohjelman haluttuun tiedostoon jollain laitteella Java-ohjelma Levy Tiedostovirta

  36. 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

  37. 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

  38. 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

  39. 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

  40. Käsitellään seuraavaksi tekstitiedoston lukemista • Tekstitiedoston tiedostovirta kuuluu Reader-ryhmään • Ryhmän yläluokka on Reader, jonka alaluokkana on mm. BufferedReader

  41. 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.

  42. Muita metodeja String readLine() • lukee yhden rivin tekstiä int read() • lukee yhden merkin, jonka palauttaa ilman koodausta kokonaislukuna void close() • sulkee tiedoston

  43. 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

  44. 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

  45. 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”)

  46. 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

  47. 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.

  48. 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

  49. 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

  50. 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.

More Related