wiki:harjoitustyo/yksinkertainen/tiedonnaytto
Last modified 2 years ago Last modified on 2016-01-06 20:36:57

Ohjelmointi 2 / yksinkertaistettu esimerkki tiedon näyttämisestä

Tässä mallissa itse käyttöliittymää on yksinkertaistettu ja KerhoSwing on jätetty pois ja siihen kuuluva koodi on KerhoGUI-tiedoston lopussa.

Seuraavissa koodeissa rivinumerot viittaavat ko. vaiheen versioon. "Lopullisessa" versioissa siten voi olla eri rivinumerot.

Käyttöliittymä

Suunniteltu käyttöliittymä

https://svn.cc.jyu.fi/srv/svn/ohj2ht/k2014/vesal/branches/yksinkertainenVaihe5.1/kuvat/paaikkuna.png

on muutettu siten, että jäsenen tiedot näytetään yhteen isoon JTextArea-komponenttiin ja jäsenten nimet näytetään ListChooser-listaan.

https://svn.cc.jyu.fi/srv/svn/ohj2ht/k2014/vesal/branches/yksinkertainenVaihe5.1/kuvat/paaikkuna5.png

Alkutilanne

Vaihe 3 on sellainen, missä on luokka KerhoGUI jossa on WindowBuilderillä piirretty käyttöliittymä, jossa muutamasta painikkeesta ja menusta tulee ilmoitus "ei toimi vielä".

Tietorakenneluokat

Aluksi on tehty luokat

  • Jasen - yksittäisen jäsenen käsittely. Osaa lähinnä rekisteröidä itsensä ja luoda sisälleen "Aku Ankka"-tiedot. Osaa myös tulostaa itsensä tietovirtaan.
  • Jasenet - pitää kaikki jäsenet yhdessä rakenteessa. Osaa toistaiseksi lisätä jäseniä ja antaa jäseniä pyydettäessä.
  • Kerho - välittäjäluokka, jolta käyttöliitymä pyytää palveluksia. Toistaiseksi osaa lisätä jäsenen sekä antaa tietyn jäsenen tiedot.

Tietojen näyttäminen (5.1)

Tässä vaiheessa on lisätty tietojen näyttäminen käyttöliittymään niin, että jäsenen tiedot vaihtuvat kun listasta valitaan toinen jäsen.

Muutokset alkutilanteeseen

Mallissa kerho-olio luodaan heti pääohjelman käynnistyessä:

94	    public static void main(final String[] args) {
95	        EventQueue.invokeLater(new Runnable() {
96	            @Override
97	            public void run() {
98	                try {
99	                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
100	                    Kerho kerho = new Kerho(); // luodaan kerho
101	
102	                    KerhoGUI frame = new KerhoGUI(kerho); // kerho dialogin käyttöön
103	                    frame.setVisible(true);
104	                } catch (Exception e) {
105	                    JOptionPane.showMessageDialog(null, "Ongelmia: " + e.getMessage());
106	                }
107	            }
108	        });
109	    }

Itse kerho viedään lomakkeelle parametrina ja näin jos olisi useita lomakkeita, ne voisivat käyttää samaa kerhoa. Käyttöliittymän muodostajaa joutuu muuttamaan niin, että Kerho tuodaan sille parametrinä:

87	    private Kerho kerho;
...
116	    public KerhoGUI(Kerho kerho) {
117	        this.kerho = kerho;

Jäsen-listan tyyppi kannattaa muuttaa sellaiseksi, että siihen voidaan tallettaa nimen lisäksi viite itse jäseneen:

85	    @SuppressWarnings({ "rawtypes", "unchecked" })
86	    private final AbstractChooser<Jasen> listJasenet = (AbstractChooser) new ListChooser();}}}

KerhoGUI:n muodostajan lopussa laitetaan listalle muutoskuuntelija:

224	        listJasenet.addSelectionChangeListener(new SelectionChangeListener<Jasen>() {
225	            @Override
226	            public void selectionChange(IStringListChooser<Jasen> sender) {
227	                naytaJasen();
228	            }
229	        });
230	        alusta();
231	    }

ja ihan muodostajan lopuksi kutsuttavassa on alusta-metodissa poistetaan (tilapäisesti) EditPanel-komponentit ja laitetaan niiden tilalle yksi JTextArea-komponentti, johon jäsenen tiedot on sitten helppo tulostaa:

298	    /**
299	     * Tekee tarvittavat muut alustukset, nyt vaihdetaan EditPanelien tilalle
300	     * yksi iso tekstikenttä, johon voidaan tulostaa jäsenten tiedot
301	     */
302	    private void alusta() {
303	        panelJasen.removeAll();
304	        panelJasen.add(areaJasen);
305	    }

Jäsenen tietojen näyttäminen tapahtuu siis kun valitun indeksi muuttuu (listan valinnan vaihtaminen laitettiin kutsumaan naytaJasen:

308	    /**
309	     * Näyttää listasta valitun jäsenen tiedot, tilapäisesti yhteen isoon edit-kenttään
310	     */
311	    protected void naytaJasen() {
312	        int ind = listJasenet.getSelectedIndex();
313	        if (ind < 0) return;
314	        jasenKohdalla = listJasenet.getSelectedObject();
315	
316	        if (jasenKohdalla == null) return;
317	
318	        areaJasen.setText("");
319	        try (PrintStream os = TextAreaOutputStream.getTextPrintStream(areaJasen)) {
320	            jasenKohdalla.tulosta(os);
321	        }
322	    }

Jotta käyttöliittymään saataisiin uusia jäseniä, on toteutettu ennen toimimaton uusiJasen-metodi:

343	    /**
344	     * Luo uuden jäsenen jota aletaan editoimaan
345	     */
346	    protected void uusiJasen() {
347	        Jasen uusi = new Jasen();
348	        uusi.rekisteroi();
349	        uusi.vastaaAkuAnkka();
350	        try {
351	            kerho.lisaa(uusi);
352	        } catch (SailoException e) {
353	            JOptionPane.showMessageDialog(null, "Ongelmia uuden luomisessa " + e.getMessage());
354	            return;
355	        }
356	        hae(uusi.getTunnusNro());
357	    }

hae-metodi hakee listan sisällön uudelleen ja laittaa sen jäsenen valituksi, jolla on kutsussa ollut id-numero:

325	    /**
326	     * Hakee jäsenten tiedot listaan
327	     * @param jnro jäsenen numero, joka aktivoidaan haun jälkeen
328	     */
329	    private void hae(int jnro) {
330	        listJasenet.clear();
331	
332	        int index = 0;
333	        for (int i = 0; i < kerho.getJasenia(); i++) {
334	            Jasen jasen = kerho.annaJasen(i);
335	            if (jasen.getTunnusNro() == jnro) index = i;
336	            listJasenet.add(jasen.getNimi(), jasen);
337	        }
338	
339	        listJasenet.setSelectedIndex(index); // tästä tulee muutosviesti joka näyttää jäsenen
340	    }

Koska listaan lisätään sekä jäsenen nimi, että viite jäseneen, on naytaJasen metodissa helppo löytää mikä jäsen vastaa listasta valittua nimeä.