wiki:harjoitustyo/guiswing
Last modified 3 years ago Last modified on 2015-02-20 18:47:30

GUI/Swing yhteistyö

Tällä sivulla on yksinkertaisella pohjalla muutos yhden luokan KerhoGUI käsittelystä kahden luokan KerhoGUI ja KerhoSwing kommunikointiin (ks. Malliharjoitustyön kuva).

Tässä pienessä esimerkissä muutoksia on vain muutama. Oikeasti muutoksia tulee useampaan kohtaan, mutta niitä kannattaa tehdä yksi pari kerrallaan. Esimerkiksi tässä esimerkissä olisi voitu ensin siirtää vaikka pelkkä uusiJasen ja kokeilla toiminta. Ja vasta sitten siirtää toinen metodi.

Tässä esimerkissä kuitenkin näkyy tarvittavien muutosten tärkein idea.

Käyttöliittymä

https://svn.cc.jyu.fi/srv/svn/ohj2ht/k2015/vesal/branches/GuiSwing/vaihe3.1/kuvat/paaikkuna.png

Vaihe aihe Versionhallinta erot .jar
Vaihe 3.1 Yksi tiedosto versionhallinta
Vaihe 3.2 Jaettu kahteen osaan versionhallinta 3.1->3.2

Selityksiä vaiheista

Vaihe 3.1: lähtötilanne

  • yksinkertainen liittymä, missä Tallenna -painike sanoo ettei toimi ja Uusi jäsen -painike lisää listJasenet-komponenttiin editPanelNimi -kenttään kirjoitetun tekstin.
  • attribuutteihin viitataan saantimetodeilla getListJasenet() ja getEditPanelNimi()
  • kaikki koodi on yhdessä tiedostossa KerhoGUI.java:
    001 package wbKerho; 
    ...
    015
    016
    017 public class KerhoGUI extends JFrame {
    018    private static final long serialVersionUID = 1L;
    019
    020    private JPanel contentPane;
    021    private final ListChooser listJasenet = new ListChooser();
    022    private final EditPanel editPanelNimi = new EditPanel();
    023    private final JButton buttonUusi = new JButton("Uusi j\u00E4sen");
    024    private final JButton buttonTalleta = new JButton("Talleta");
    025
    026
    027    public static void main(String[] args) {
    ...
    037                    KerhoGUI frame = new KerhoGUI();
    038                    frame.setVisible(true);
    ...
    044    }
    045
    046
    047    /**
    048     * Create the frame.
    049     */
    050    public KerhoGUI() {
    051        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    052        setBounds(100, 100, 410, 300);
    053        contentPane = new JPanel();
    054        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    055        setContentPane(contentPane);
    056        contentPane.setLayout(null);
    057        listJasenet.getCaptionLabel().setText("J\u00E4senet");
    058        listJasenet.setBounds(10, 11, 91, 231);
    059        
    060        contentPane.add(listJasenet);
    061        buttonUusi.addActionListener((e) -> uusiJasen());
    062        buttonUusi.setBounds(10, 242, 89, 23);
    063        
    064        contentPane.add(buttonUusi);
    065        editPanelNimi.setText("Ankka Aku");
    066        editPanelNimi.setBounds(111, 11, 256, 20);
    067        
    068        contentPane.add(editPanelNimi);
    069        buttonTalleta.addActionListener( (e) -> talleta());
    070        buttonTalleta.setBounds(109, 242, 89, 23);
    071        
    072        contentPane.add(buttonTalleta);
    073    }
    074    
    075    // ======================================================================
    076    
    077    private AbstractChooser<String> getListJasenet() { return listJasenet;  }
    078    private EditPanel getEditPanelNimi() { return editPanelNimi;  }
    079    
    080    public void uusiJasen() {
    081        getListJasenet().add(getEditPanelNimi().getText());
    082    }
    083
    084    
    085    public void talleta() {
    086        JOptionPane.showMessageDialog(this, "Talletuksessa ongelmia! ");
    087    }
    088    
    089 }
    

Vaihe 3.2: jaettu kahteen luokkaan

source:/moniste/kuvat/GuiSwing.png

  • koodi jaettu kahteen osaan KerhoGUI (piirtämällä tullut koodi) ja KerhoSwing, jossa varsinainen toiminta
  • käyttöliittymään KerhoGUI tehdyt muutokset
  • muutokset on tehty editoimalla lähdekoodia:
    • lisätty attribuutiksi viite KerhoSwing -luokkaan
      027    protected final KerhoSwing kerhoswing;	
      
    • KerhoSwing -tarvitsemat attribuutit julkisiksi
      029    public final ListChooser listJasenet = new ListChooser();
      030    public final EditPanel editPanelNimi = new EditPanel();
      
    • luotu kerhoswing muodostajan alussa ja samalla viedään kerhoswingille tiedoksi viite tähän KerhoGUI -lomakkeeseen, jotta kerhoswing pääsee viittaamaan lomakkeella oleviin komponetteihin:
      060    public KerhoGUI() {
      061        kerhoswing = new KerhoSwing(this);
      
    • muutettu metodikutsut viittaamaan kerhoswing -olioon:
      072        buttonUusi.addActionListener( (e) -> kerhoswing.uusiJasen() );
      080        buttonTalleta.addActionListener( (e) -> kerhoswing.talleta() );
      
  • siirretty vastaavat koodit KerhoSwing-luokkaan. Mahdolliset this-viitteet

on vaihdettu kerhoGUI viitteiksi:

1   package kerhoswing;
2   
3   import javax.swing.JOptionPane;
4   import fi.jyu.mit.gui.AbstractChooser;
5   import fi.jyu.mit.gui.EditPanel;
6   import wbKerho.KerhoGUI;
7   
8   public class KerhoSwing {
9       private KerhoGUI kerhoGUI;
10      
11      public KerhoSwing(KerhoGUI kerhoGUI) {
12          this.kerhoGUI = kerhoGUI;
13      }
14  
15      
16      private AbstractChooser<String> getListJasenet() { return kerhoGUI.listJasenet;  }
17      private EditPanel getEditPanelNimi() { return kerhoGUI.editPanelNimi;  }
18      
19      public void uusiJasen() {
20          getListJasenet().add(getEditPanelNimi().getText());
21      }
22  
23      
24      public void talleta() {
25          JOptionPane.showMessageDialog(kerhoGUI, "Talletuksessa ongelmia! ");
26      }
27  
28  }
  • kerhoSwing pääsee nyt kerhoGUI -viitteen kautta käsiksi tarvittaviin graafisiin komponentteihin, jotta se voi laittaa sinne sitä tietoa, mitä sinne tarvitsee laittaa.