You are on page 1of 9

OISISI - Termini 19

JTable

19.1. Klasa JTable

19.2. Interfejs TableModel

19.3. Interfejs ListSelectionListener

OISISI - Termini 19

JTable

19.1. Klasa JTable Klasa JTable slui za tabelaran prikaz podataka sa opcionalnom mogunou izmene podataka u tabeli. JTable ne sadri niti keira podatke koje prikazuje, ona slui samo za prikaz podataka koji su smeteni u nekoj drugoj klasi:

Najjednostavniji nain za kreiranje tabele u Javi jeste korienjem dvodimenzionalne matrice objekata koja sadri podatke koji e se prikazati u tabeli i jednodimenzionalnim nizom stringova koji sadri zaglavlja kolona tabele. Broj elemenata u nizu stringova koji sadri zaglavlja kolone tabele mora biti identian broju kolona u matrici objekata:

Primer 1. Kreiranje tabele bez korienja modela:


String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; Object[][] data = { {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)}, {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)}, {"Sue", "Black", "Knitting", new Integer(2), new Boolean(false)}, {"Jane", "White","Speed reading", new Integer(20), new Boolean(true)}, {"Joe", "Brown", "Pool", new Integer(10), new Boolean(false)}

JTable table = new JTable(data, columnNames)

OISISI - Termini 19

JTable

19.2. Interfejs TableModel Svaka instanca klase JTable koristi Table model objekat da bi upravljala podacima koje prikazuje u sebi. Table model objekat mora implementirati interfejs TableModel. ak i ukoliko se prilikom kreiranja JTable objekat ne navede Table model objekat, JTable automatski kreira instancu DefaultTableModel -a, Javine klase koja implementira navedeni interfejs. Dakle, ak i kada tabelu kreiramo na najjednostavniji nain (primer 1.) Java e u pozadini napraviti jednu instancu klase DefaultTableModel koji e na osnovu prosleenog niza i matrice upravljati prikazom podataka u objektu JTable.

Kreiranje JTable objekta korienjem Table model objekta najjednostavnije je nasleivanjem klase AbstractTableModel. Ovo je apstraktna Javina klasa koja implementira interfejs TableModel. Naa klasa koja e predstavljati model nasleivae klasu AbstractTableModel. Podatke koji e se prikazivati u tabeli naa klasa moe sadrati u obliku matrice objekata, vektora objekata, hashmape objekata ili dobijati iz nekog drugog izvora (baza podataka ili neka druga klasa). Mogue je ak korienjem klase AbstractTableModel podatke za model dobiti i u trenutku generisanja tabele (upravo ovako emo mi raditi). Da bi se implementirao TableModel nasleivanjem apstraktne klase AbstractTableModel klase potrebno je redefinisati apstraktne metode. Postoje 3 apstraktne metode u ovoj klasi: Metoda
public int getRowCount()

Opis metode Ukupan broj redova u tabeli. JTable prilikom formiranja poziva ovu metodu svog TableModela i na osnovu dobijene vrednosti formira traeni broj redova. Ukupan broj kolona u tabeli. JTable prilikom formiranja poziva ovu metodu svog TableModela i na osnovu dobijene vrednosti formira traeni broj kolona. Vrednost koja e u tabeli biti prikazana u row-oj koloni i column-toj eliji tabele. Za svaku eliju u tabeli JTable poziva ovu metodu i na osnovu dobijene vrednosti prikazuje podatak u eliji.

public int getColumnCount()

public Object getValueAt(int row, int column)

OISISI - Termini 19

JTable

Primer 2. Primer AbstractTableModel

jedne

implementacije

prostog

modela

korienjem

klase

public class DialogTableModel extends AbstractTableModel{ //niz stringova koji predstavljaju nazive kolone private String[] columnNames ; //matrica podataka koja e se prikazivati u tabeli private Object[][] data;

//konstruktor u kome prosleujemo naziv kolona i podatke za prikaz public DialogTableModel(String[] columnNames, Object[][] data ){ this.columnNames = columnNames; this. data = data; } //metoda kojom vratimo naziv kolone na col-tom mestu //za svaku kolonu u tabeli JTable e pozvati ovu metodu sa //odgovarajuim col indeksom kolone public String getColumnName(int col) { return columnNames[col]; } //broj kolona u tabeli, JTable e prilikom formiranja tabeli pozvati //ovu metodu public int getColumnCount() { return columnNames.length; } //broj redova u tabeli, prilikom //ovu metodu public int getRowCount() { return data.length; } svakog osveavanja JTable poziva

//podatak koji e se u tabeli prikazati u rowIndex-toj vrsti i //columnIndextoj koloni, JTable table poziva prilikom svakog //osveavanja ovu metodu columnCount*rowCount puta public Object getValueAt(int rowIndex, int columnIndex) { // TODO Auto-generated method stub return data.[rowIndex][columnIndex]; } }

Iz navedenog primera vidimo da je mogue da za svaku nau tabelu u aplikaciji koristimo istu klasu za model, kojoj emo u konstruktoru prosleivati odgovarajui niz stringova koji e sluiti za naziv zaglavlja kolona i matricu objekata kojom e model puniti tabelu. Loa osobina ovakve realizacije je redudantnost podataka u aplikaciji: podaci koje bi drali u matrici objekata u modelu ve se nalaze u hashmap-i u naim klasama.

OISISI - Termini 19

JTable

Moemo izbei redudantnost u modelu tako to emo modifikovati DialogTableModel klasu izbacivanjem matrice objekata i modifikovanjem metoda getRowCount() i getValueAt() tako da podatke uzimaju direktno iz naih klasa u kojima se nalaze hashmap-e. Za potrebe komunikacije izmeu TableModel-a i naih klasa koje sadre hashmap-e sa podacima koje trebamo prikazati u tabeli uveden je novi interfejs: ITableModel: Primer 3.
/** * * @author Igor Zeevi * * Ovaj interfejs slui za povezivanje JTable-a i klase u kojoj se nalazi mape podataka * Interfejs implementiraju sve klase u kojima se nalaze mape (Drzave, Korisnici...) * On e obezbediti da svaka tabela koristi istu klasu za Model DialogTableModel * */ public interface ITableModel { /* * Vraca broj elemenata u hash mapi */ int getRowCount(); /* * Vraca vrednost za zadati red i kolonu */ Object getValueAt(int rowIndex, int columnIndex);

} Ako se implementira ovaj interfejs u klasi Drzave koja sadri hashmap-u drava:
@Override public int getRowCount() { return drzave.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { ArrayList<Drzava> vec=new ArrayList<Drzava>(drzave.values()); switch(columnIndex){ case 0: return vec.get(rowIndex).getOznakaDrzave(); case 1: return vec.get(rowIndex).getNazivDrzave(); } return ""; }

OISISI - Termini 19

JTable

Sada imamo mogunost da model koji e predstavljati podatke koji e se prikazati u tabeli za drave direktno poziva ove dve metode i na taj nain nemamo redudantne podatke o dravama u naoj aplikaciji:
public class DialogTableModel extends AbstractTableModel{ private String[] columnNames ; private ITableModel itableModel; public DialogTableModel(String[] columnNames, ITableModel itableModel ){ this.columnNames = columnNames; this.itableModel = itableModel; } public String getColumnName(int col) { return columnNames[col]; } public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return itableModel.getRowCount(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return itableModel.getValueAt(rowIndex, columnIndex); } }

Kreiranje tabele za prikaz svih podataka koristi isti TableModel samo se druga vrsta klase koja sadri mapu sa podacima prosleuje, na primer za kreiranje tabele drava:
columns=new String[2]; columns[0]=MainFrame.getInstance().getResourceBundle().getString("lblOznakaDrzave"); columns[1]=MainFrame.getInstance().getResourceBundle().getString("lblNazivDrzave"); tableModel=new DialogTableModel(columns, Multiteka.getInstance().getDrzave());

U Terminu19 pogledati pakete model i model.tablemodel u kome se nalaze ITableModel interfejs i DialogTableModel klasa. Klase Drzave i Korisnici u paketu model.collections implementiraju ITableModel interfejs. Pogledati klase DialogKorisnici i DialogDrzave u gui.dialog.dialogs paketu u kome se vri kreiranje modela i kreiranje JTable objekta. U klasi Multiteka postoji privremena metoda init() koja dodaje 1000 drava i korisnika u mape.

OISISI - Termini 19

JTable

Metode klase JTable: Naziv setAutoCreateRowSorter(boolen) Opis Automatsko sortiranje kolone u tabeli izvrava se na klik na zaglavlje kolone. Redovi se sortiraju u odnosu na tip podatka koji se nalazi u tabeli. Inicijalno sve kolone u tabeli imaju istu irinu i tabela inicijalno ne moe zauzeti vie od predvienog prostora. Da li je mogue selektovati vie od jednog reda u tabeli

setAutoResizeMode(int RESIZE_MODE)

setSelectionMode(int SELECTION_MODE)

U sluaju da promenimo default resize mode u tabeli i iskoristimo JTable.AUTO_RESIZE_OFF imamo mogunost da svakoj koloni zadamo proizvoljnu irinu:
table.getColumnModel().getColumn(0).setMinWidth(150); table.getColumnModel().getColumn(1).setMinWidth(550);

Nakon svake izmene podataka u naim mapama (izmena, dodavanje, brisanje) potrebno je osveiti prikaz podataka u tabeli. Ovo je mogue na dva naina: 1. Registrovati table model kao sluaoca klase u kojoj se nalazi hashmap-a, pa prilikom svake izmene podataka u mapi, bie obaveten slualac o promeni podataka (preporuen nain implementacije) 2. Nakon svake promene podataka u mapi runo osveavanje prikaza u tabeli. Ono se svodi na pristup modelu u JTable objektu i pozivanje metode fireTableDataChanged() koja osveava prikaz svih kolona i redova u tabeli:
DialogTableModel tm= (DialogTableModel) table.getModel(); tm.fireTableDataChanged();

OISISI - Termini 19

JTable

19.3. Interfejs ListSelectionListener List Selection dogaaji se pojavljuju kada se menja selekcija u SWING komponentama kao to su JTable ili JList. Ove dogaaje mogu izazvati klase koje implementiraju interfejs ListSelectionModel kao to je klase JTable. Klasa koja implementira interfejs ListSelectionListener obraivae dogaaje promene selekcije u JTable komponenti. U naoj aplikaciji ovo je neophodno za popunjavanje detalja dijaloga prilikom promene selekcije u tabeli. Ovu klasu neohodno je prijaviti kod ListSelectionModel -a komponente pozivom metode addListSelectionListener, kojoj se prosleuje ListSelectionListener. ListSelectionListener interfejs ima samo jednu metodu koju je potrebno implementirati: valueChanged. Ova metoda se poziva svaki put kada se menja selekcija u komponenti za koju je implementacija ListSelectionListener-a pridruena. Svaki dogaaj promene selekcije opisan je instancom klase ListSelectionEvent.

Metode klase ListSelectionEvent: Metoda Object getSource() Opis metode Vraa objekat koji je izazvao dogaaj. Ukoliko je ListSelectionListener registrovan direktno kod komponente ova metoda vraa direktno tu komponentu (mogue kod JList komponente). Ukoliko je ListSelectionListener registrovan kod ListSelectionModel-a tada metoda getSource vraa ovaj model kao izvor dogaaja promene selekcije. Vraa indeks prve stavke u komponenti ija je selekcija promenjena. U tabeli ovo e predstavljati indeks reda koji je izgubio selekciju. Vraa indeks poslednje stavke u komponenti ija je selekcija promenjena. U tabeli ovo e predstavljati indeks reda koji je dobio selekciju. Mogue je da prilikom jedne promene selekcije doe do viestrukog poziva metoda valueChanged. Sve dok postoji promena selekcija ova metoda e vratiti true vrednost. Mnogi sluai promene selekcije bie zainteresovani samo za finalnu promenu selekcije koja kada se desi, metoda getValueIsAdjusting vraa false.

int getFirstIndex()

int getLastIndex()

boolean getValueIsAdjusting()

OISISI - Termini 19

JTable

Svaka promena selektovanog reda u tabeli treba da dovede do osveavanja u prikazu detalja dijagrama. Da bismo registrovali promenu selektovanog reda u tabeli moramo implementirati interfejs ListSelectionListener i registrovati ovaj interfejs u JTable objektu:
// povezivanje selection listenera sa tabelom: ListSelectionModel lsm = table.getSelectionModel(); lsm.addListSelectionListener(new StudentiSelectionListener());

Interfejs ListSelectionListener ima samo jednu metodu valueChanged() koja se poziva prilikom promene selekcije u tabeli. Unutar ove metode potrebno je odraditi sledee: 1. Odrediti indeks selektovanog reda u tabeli 2. Iz tabele uzeti vrednost kljua objekta koji se posmatra 3. Pristupiti odgovarajuoj mapi objekata i dobiti selektovani objekat korienjem pronaenog kljua 4. Korienjem dobijenog objekta popuniti detalj dijaloga Kao primer korienja interfejsa ListSelectionListener-a pogledati DrzaveSelectionListener i StudentiSelectionListener koje su unutranje klase DialogDrzave i DialogKorisnici klasa.

You might also like