vineri, 12 iunie 2009

Utilizarea JTable in Swing - Partea 1

Obiective

Scopul acestui tutorial este de a exemplifica modul de functionare si utilitatea elementului JTable. In principal se vor aborda elemente legate de modul in care se utilizeaza, cum se poate contrui un renderer, un column model, sau diferitele moduri de selectie. Acest tutorial presupune cunostinte medii despre limbajul Java si despre modul de construire a interfetelor grafice folosind Swing. In cadrul sau vor fi abordate doar elementele necesare explicarii elementului JTable.

1. Introducere

Tabelele reprezinta una dintre cele mai des utilizate modalitati de vizualizare a datelor. Prin folosirea unui tabel inregistrarile dintr-o baza de date sunt usor de sortat si slectat. Informatiile despre spatiul liber disponibil pe hard pot fi afisate pentru mai multe calculatorare in perioade de timp diferite, folosind un tabel. Cotatiile la bursa pot fi de asemena urmarite cu usurinta sau vanzarile efectuate. Clasa JTable din pachetul Swing ofera posibilitatea de a efecuta foarte usor elementele descrise anterior si chiar mai mult.

Tabelele pot fi gandite ca un mod de reprezentare a datelor bidimensionale. De fapt, clasa JTable are chiar un constructor care primeste ca argument un masiv bidimensional de obiecte din clasa Object (Object [][]) si afiseaza continutul acestora in liniile si coloanele unui tabel. De exemplu figura urmatoare arata un tabel de obiecte String:


Acest exemplu a fost generat folosindu-se foarte putin cod. Tot ce a fost nevoie sa facem a fost sa cream un obiect de tip JTable folosind un argument de tip String[][] pentru continutul tabelului si un argument de tip String[] pentru header-ul tabelului. In loc sa adaugam tabelul direct pe fereastra l-am incapsulat intr-un ScrollPane.

// LECSimpleTable.java
// O simpla clasa de test utilizand un table model standard
import java.awt.*;
import javax.swing.*;

public class LECSimpleTable extends JFrame {

public LECSimpleTable( ) {
super("LEC JTable Test");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);

JTable jt = new JTable(new String[][] { {"acesta", "este"}, {"un", "test"} },
new String[] {"Coloana", "Rand"});
JScrollPane jsp = new JScrollPane(jt);
getContentPane( ).add(jsp, BorderLayout.CENTER);
}

public static void main(String args[]) {
LECSimpleTable st = new LECSimpleTable( );
st.setVisible(true);
}
}

Dupa cum puteti observa folosind modele de date care au fost deja contruite, singurul lucru pe care trebuie sa il facem este sa trimitem ca parametrii datele noastre si header-ele pentru coloane, clasa JTabel ocupandu-se de restul operatiilor. Folosind modelele defaut puteti selecta mai multe randuri simultan, sa editati anumite celule, si sa interceptati evenimentele de selectie. Insa nu sunteti limitati doar la modelele default, si puteti obtine o serie de functionalitati destul de interesante in cazul in care suprascriteti comporatmentul modelelor default.

2. Realizarea unui Column Model

Mai jos aveti codul pentru un column model modficat, care ordoneaza coloanele in ordine alfabetica pe masura ce sunt adaugate:

// LECSortingColumnModel.java
// O extensie a clasei DefaultTableColumnModel care sorteaza noile
// coloane introduse.
import javax.swing.table.*;
public class LECSortingColumnModel extends DefaultTableColumnModel {
public void addColumn(TableColumn tc) {
super.addColumn(tc);
int newIndex = sortedIndexOf(tc);
if (newIndex != tc.getModelIndex( )) {
moveColumn(tc.getModelIndex( ), newIndex);
}
}
protected int sortedIndexOf(TableColumn tc) {
int stop = getColumnCount( );
String name = tc.getHeaderValue( ).toString( );
for (int i = 0; i < stop; i++) {
if (name.compareTo(getColumn(i).getHeaderValue( ).toString( )) <= 0) {
return i;
}
}
return stop;
}
}

Implementarea modelului este una destul de simpla. Suprascriem metoda addColumn(), in acest fel asociind comportamentul dorit de noi. Puteti folosi acest column model cu orice tip de data. Din moment ce avem un tabel model si un column model le putem folosi pentru a construi un JTable. Ulterior acestei operatii toate coloanele pe care le adaugam sunt sortate in ordine alfabetica, indiferent de ordinea in care sunt adaugate initial. Rezultatul poate fi vizualizat in figura de mai jos


Mai jos aveti codul care care realizarea conexiunea dintre tabel si column model:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class LECColumnExample extends JFrame {

public LECColumnExample( ) {
super("LEC Abstract Model JTable");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);

DefaultTableModel dtm = new DefaultTableModel(new String[][] {
{"1", "2", "3"}, {"4", "5", "6"} },
new String[] {"numele", "ordonate", "crescator"});
LECSortingColumnModel scm = new LECSortingColumnModel( );
JTable jt = new JTable(dtm, scm);
jt.createDefaultColumnsFromModel( );

JScrollPane jsp = new JScrollPane(jt);
getContentPane( ).add(jsp, BorderLayout.CENTER);
}

public static void main(String args[]) {
LECColumnExample ce = new LECColumnExample( );
ce.setVisible(true);
}
}

Niciun comentariu:

Trimiteți un comentariu