import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; import java.util.Date; import java.awt.*; public class JTableEsim2 { public static void main(String[] args) { // Taulukkomalli JoukkueTaulu malli = new JoukkueTaulu(); // Luo JTable-taulun, joka näyttää mallin JTable taulu = new JTable(malli); // Sijoitetaan taulu kehykseen ja näytetään se JFrame kehys = new JFrame("Joukkueita"); kehys.getContentPane().setLayout(new BorderLayout()); kehys.getContentPane().add( new JScrollPane(taulu), BorderLayout.CENTER); kehys.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); kehys.setSize(600, 300); kehys.setVisible(true); } } class JoukkueTaulu extends AbstractTableModel { // Joukkueen tiedot ovat taulukossa protected Joukkue joukkue[] = new Joukkue[4]; // Sarakkeiden nimet protected String[] nimet = new String[] { "nimi", "pelit", "pisteet", "päivitetty" }; // Sarakkeissa olevat tietotyypit protected Class[] luokat = new Class[] { String.class, Integer.class, Integer.class, String.class }; public JoukkueTaulu() { // Alustaa joukkuiden tiedot. joukkue[0] = new Joukkue("Jokerit", 20, 28); joukkue[1] = new Joukkue("HIFK", 20, 22); joukkue[2] = new Joukkue("Tappara", 20, 29); joukkue[3] = new Joukkue("Ilves", 20, 24); // Lisätään tapahtumankuuntelija. addTableModelListener(new TaulukkoKuuntelija()); } // Palauttaa sarakkeiden lukumäärän public int getColumnCount() { return 4; } // Palauttaa rivien lukumäärän public int getRowCount() { return 4; } // Palauttaa sarakkeen nimen. public String getColumnName(int nro) { return nimet[nro]; } // Palauttaa sarakkeessa olevan tietotyypin luokan. public Class getColumnClass(int nro) { return luokat[nro]; } // Palauttaa taulukon solun arvon paikasta (rivi, sarake). public Object getValueAt(int rivi, int sarake) { switch(sarake) { case 0: return joukkue[rivi].palauta_nimi(); case 1: return new Integer(joukkue[rivi].palauta_pelit()); case 2: return new Integer(joukkue[rivi].palauta_pisteet()); case 3: return joukkue[rivi].muutos_paiva(); default: return null; } } // Ottelu- ja pistemäärää voi editoida public boolean isCellEditable(int rivi, int sarake) { if (sarake == 1 || sarake == 2) return true; else return false; } // Aseta luvun arvo paikkaan (rivi, sarake) public void setValueAt(Object arvo, int rivi, int sarake) { switch (sarake) { case 1: joukkue[rivi].aseta_pelit( Integer.parseInt(arvo.toString())); fireTableDataChanged(); break; case 2: joukkue[rivi].aseta_pisteet( Integer.parseInt(arvo.toString())); fireTableDataChanged(); break; default: return; } } // Tietomalliin liittyvä tapahtumankäsittely class TaulukkoKuuntelija implements TableModelListener { // JOs taulukkoon kohdistuu jokin muutos // Tulostetaan arvot. public void tableChanged(TableModelEvent e) { for (int i=0; i< getRowCount(); i++) { for (int j=0; j< getColumnCount()-1; j++) System.out.print(getValueAt(i, j) + "\t"); System.out.println(); } } } } class Joukkue { String nimi; // Joukkueen nimi. int pelit, // ottelujen pelit. pisteet; // ottelujen pisteet. Date pvm; // viimeinen päivitys. Joukkue(String n, int pel, int pi) { nimi = n; pelit = pel; pisteet = pi; pvm = new Date(); } public String palauta_nimi() { return nimi; } public int palauta_pelit() { return pelit; } public String muutos_paiva() { return pvm.getDate() + ". " + (1 + pvm.getMonth()); } public int palauta_pisteet() { return pisteet; } // Asetusmetodeita public void aseta_pelit(int p) { pelit = p; } public void aseta_pisteet(int p) { pisteet = p; } public void aseta_muutospaiva() { pvm = new Date(); } public void aseta_nimi(String n) { nimi = n; } }