Praktikumitöö:graafiline rakendus

Allikas: Lambda

Alltoodud ülesande üksikuid nüansse täiendatakse (kuid olemasolevaid detaile ei muudeta!) novembri esimese nädala jooksul.

Taustaks võid vaadata veidi sarnast ülesannet eelmisest aastast: Praktikumitöö:võrgurakendus

Ülesandeks on teha käsurealt käivitatav rakendus, mis esitab valuutakursside muutumise graafikuid. Valuutakursse tuleb lugeda Eesti panga lehelt, täpselt nagu praktikumis kaks: Praktikumitöö: Raamatute hinnavaatlus. Vahe kursside lugemisel on selles, et tuleb lugeda kursse mitte ainult ühe, vaid mitme päeva kohta. Graafikuid tuleb esitada mitmes variandis, vastavalt kasutaja eelistustele, info siin allpool.

Olulist hindamise ja nõuete kohta

Programm peab tingimata saama hakkama nende asjadega:

  • Andmete lugemisega Eesti Panga infoserverist, mingi mõistliku perioodi jaoks kuni eilse päevani.
  • Graafiku kuvamisega vähemalt ühe valuuta kohta, mida kasutaja peab saama valida.

Sellisel juhul saab ülesanne arvestatud. Muud allpool toodud asjad on samuti nõutud: nende puudumisel võetakse maha punkte, töö saab aga siiski arvestatud.

Täiesti OK on kasutada järgmisi lihtsustusi (st nende puhul punkte maha ei võeta):

  • Panna valuutavaliku boksidesse fikseeritud hulk valuutasid (vähemalt 10), st mitte täita bokse pangast loetud valuutadega. Kui valitud valuuta kohta infot pangast ei tule, anda lihtsalt veateade. Valuutasid, mida boksides pole, aga pangast tuleb, võib lihtsalt ignoreerida (st neid ei ole siis vaja ka andmetabelisse kirjutada).
  • Võrdluseks võtta maksimaalselt üks valuuta (siis ei ole vaja listiboksi, piisab harilikust valikuboksist).
  • Mitte kuvada all skaalale vahepealseid kuupäevi: piisab algus- ja lõpukuupäevast.
  • Fikseerida koodis ära maksimaalne arve päevi, mida kuvatakse, näiteks 360 päeva, ja anda veateade, kui soovitakse pikemat perioodi võtta.

Kui kogu alltoodud funktsionaalsus on OK realiseeritud, saab lisaks harilikule 10-le ühe lisapunkti.

Kasutajaliides

Kasutajaliides peab koosnema vähemalt järgmistest komponentidest:

  • Üleval kuupäeva sisestuspaneel, kus on:
    • sisestusväli alguskuupäeva ja lõpukuupäeva jaoks. Vaikimisi peaks seal olema väärtused viimase kuu jaoks (kuni eilse päevani). Kasutaja saab sinna ise kirjutada mõned teised kuupäevad.
  • All nupu/valikupaneel, klus kuvatakse:
    • nupp "Näita"
    • nupp "Katkesta"
    • valikuboks kuvamise stiiliga (absoluutväärtused või miinimum-maksimum piirides)
    • valikuboks baasvaluutaga (vaikimisi EEK): selle suhtes näidatakse teiste valuutade kursse.
    • valikuboks põhivaluuta ehk kuvatava valuutaga (vaikimisi USD): see on valuuta, mille graafikut kuvatakse (visuaalselt järgmistest eristuv).
    • valikuboks mitme valikuga, kus on võimalik valida valuutasid võrdluseks, vaikimisi on valitud USD, saab valida korraga mitu. Need graafikud pannakse siis põhivaluuta graafiku peale, alguspunktid ühtivad.
  • joonistamispaneel, kuhu kuvatakse graafikud.
  • Päris all "status bar" ehk info lugemise ülevaate paneel (kitsas riba!), kuhu kuvatakse info selle kohta, mitu päeva on loetud, kas lugemise käigus tuli vigu (kui tuli)

Kuidas graafik võiks välja näha

Iga graafik peaks olema joon, soovitavalt iga joon eri värvi. Joon on pidev, vasakust äärest paremale. Põhivaluuta võiks olla alati sama värvi (sinine, punane vms) ja võrdlusvaluutade graafikutest veidi paksema joonega või teisiti visuaalselt eristuv.

Kindlasti tee koordinaatide rehkendus nii, et jooned mahuks ekraanile ära ja ei jääks liiga väikeseks (ideaalis jookseks maks punkt joonistamisruumi ääreni).

Graafikule tee alla kuupäevajoon ja kuva sellele vasakule algus ja paremale lõpukuupäev. Vasakule tee kursi (suhte) joon ja kuva sellele vähemalt ülemise ääre väärtus ja alla alumise ääre väärtus, vahele keskmine. NB! Siin antakse töö käigus täpsustavaid nüansse.

Soovitusi

Alustamiseks

Alustamiseks võid kasutada seda näiterakendust, mida loengus oleme arendanud: guiexample.java.

NB! guiexample.java kasutamise korral on mõttekas panna buttonpanel akna alläärde (SOUTH), muidu peab hakkama lahendama küsimust comboboxi kuvamisest Canvas'e peale.

Mõttekas on lugeda läbi ka Ecki õpiku GUI-komponentide peatükk http://math.hws.edu/javanotes/c6/index.html ja selle jätk http://math.hws.edu/javanotes/c12/index.html.

Andmete hoidmine

Kõige lihtsam on hoida kursi-infot kahemõõtmelises double massiivis (väikese tähega!) kus iga rida on üks valuuta ja iga tulp üks päev. Kui mõne päeva kohta infot ei ole, siis jääb see tulp lihtsalt ära.

OK lahendus on teha algul valmis fikseeritud suurusega massiiv (näiteks 100 valuutat ja 360 päeva), ning keelduda kuvamast vahemikke, mis on pikemad, kui üks aasta.

Loetud valuutade nimesid (USD, EUR jne) tasub hoida lihtsalt ühemõõtmelises String massiivis, kus nime positsioon massiivis vastab reale kahemõõtmelises massiivis, kus vastava valuuta numbreid hoitakse. Kui fikseerida ära valikubokside sisu, siis võib selle valuutade nimede tabeli kohe ette ära täita (vastavalt bokside sisule).

Kuupäevad

Kuupäevade parsimiseks tasub kasutada SimpleDateFormat klassi, vaata mh http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

Koodinäide:


      /*  impordi need:
         import java.util.*;
         import java.text.SimpleDateFormat;
     */

        String test = "22.01.2007";
        //Parse given string       
        SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");       
        try {
          Date testdate = formatter.parse(test); 
          //Format and print          
          String testout = formatter.format(testdate);
          System.out.println(testout);
          // Add two days and print
          Calendar calendar = Calendar.getInstance();
          calendar.setTime(testdate);
          calendar.add(Calendar.DATE, 2);
          testdate=calendar.getTime();
          testout = formatter.format(testdate);
          System.out.println(testout);
        } catch (Exception e) {
          System.out.println("viga parsimisel");
          System.exit(0);
        }       

Comboboxid

Põhjaliku comboboxide kasutusjuhendi leiad siit: http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html Muuhulgas soovitab juhend sellist struktuuri:

public class ComboBoxDemo ... implements ActionListener {
    . . .
        petList.addActionListener(this) {
    . . .
    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox)e.getSource();
        String petName = (String)cb.getSelectedItem();
        updateLabel(petName);
    }
    . . .
}

kus ComboBoxDemo rolli sobiks meie juhul guiexampleFrame klass, mille sees olev keeruline nupu külge pandav addActionListener

  button.addActionListener(new ActionListener() { ....
  });

tuleks asendada lihtsamaga:

  button.addActionListener(this);


Samuti soovitan teha guiexampleFrame ümber nii, et comboboxid oleks guiexampleFrame klassis (kus on ka äsjakirjeldatud handler nupule) klassi jaoks globaalsed muutujad. Hoiatus äsjatoodud ComboBoxDemo jaoks: see näide eeldab, et ActionEvent e tuleb comboboxi muutmisest, meie juhul tuleb ta aga hoopis nupust. Seega (JComboBox)e.getSource() ei ole meie jaoks mõttekas, pigem tuleb lihtsalt lugeda comboboxide kui guiexampleFrame jaoks globaalsete muutujate väärtust.


ListBoksid

Mitme valikuga boksi tegemiseks saad kasutada näiteks JList kompoenti. Selle komponendi tuunimiseks ja sättimiseks on palju võimalusi, otsi ise klasside õpetusest jne. Katseta järgmise näitega:

      

        String[] choices = {"USD", "JPY", "SEK", "GBP"};

        JList lst = new JList(choices);

        lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        lst.setLayoutOrientation(JList.VERTICAL);

        lst.setVisibleRowCount(2);

        JScrollPane listScroller = new JScrollPane(lst);

        listScroller.setPreferredSize(new Dimension(90,30));

        selectionpanel.add(listScroller);

Kasulikke tutoriale (lisaks Ecki raamatule)