Java - Grafické komponenty (53.díl)

Napsal O webu (») 10. 8. 2008 v kategorii Programování, přečteno: 4626×
obrazky/java_logo.png

JTable

Komponenta představuje tabulku, často se používá pro zobrazování výsledků výpočtů, výpisu seznamů či zadávání vstupních dat. Data v tabulce mohou, ale nemusí bý editovatelná. S tabulkou se zpravidla pracuje za použití dvojice modelů. První model je používán pro sloupce (z časového hlediska se mu nebudeme věnovat), druhý model pro celou tabulku. Model sloupce ovlivňuje způsob zobrazení dat ve sloupci či možnosti jejich editace, model tabulky disponuje řadou metod pro práci s vlastní tabulkou. Možnosti práce s tabulkami jsou v Javě velmi rozsáhlé (některé pasáže jsou poměrně obtížné a komplikované), uvedeme pouze nejdůležitější informace. K dispozici je několik konstruktorů
JTable ();
JTable (int rows,int columns);
JTable (TableModel t);
JTable(Object[][] data, Object[] column_names)
JTable(Vector row_data, Vector column_names)

První z konstruktorů vytvoří prázdnou tabulku, druhý prázdnou tabulku se zadaným počtem řádků a sloupců, třetí tabulku naplněnou komponentami z instance třídy TableModelu. Čtvrtý a pátý konstruktor vytvoří tabulku naplněnou daty, včetně názvů sloupců. Tyto konstruktory mají některé praktické nevýhody. Všechny položky tabulky jsou editovatelné, jednotlivé prvky tabulky musí být uloženy v dynamické datové struktuře představované vektorem.
Přidání tabulky na JScrollPane. Při práci s rozsáhlými tabulkami je vhodné provést jejich přidání na JScrollPane. Učiníme to podobným způsobem jako v případě seznamů.
ScrollPane sp = new JScrollPane(table,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);


Implementace modelu. Chceme -li vytvořit vlastní model tabulky, použijeme abstraktní třídu AbstractTableModel. Astraktní metody třídy je nutné předefnovat, můžeme tak ovlivnit jejich funkčnost podlem potřeby. V tomto případě je nutné předefnovat následující trojici metod: getRowCount(), getColumnCount() a getValueAt(). Dále je vhodné předefnovat metou getColumnName() vracející jméno sloupce. Chceme -li tabulku následně editovat, musíme přetížit metody setValueAt(int row,int column) a isCellEditable(bool status). Při změně dat je nutné tuto informaci poskytnout všem zaregistrovaným posluchačům.

Pro jednodušší případy, kdy vystačíme s výchozí implementací, je vhodnější použít třídu DefaultTableModel. Jednotlivé řádky jsou ukládány do dynamické struktury Vector. Model umožňuje automatické generování událostí při změně dat uživatelem, buňky tabulky lze tedy editovat.

Vytvoření tabulky. V příkladu věnovaném práci s tabulkou vytvoříme třídu, která je potomkem abstraktní třídy AbstractTableModel. Tabulka bude tvořena 5 sloupci, které budou zobrazovat mocniny čísel prvních pět členů aritmetických posloupností čísel 1-5. Třídu nazveme Tabulka. Obsah tabulky tvoří položky 2D pole typu Object, sloupce položky pole typu String. Deklarujeme odkazy na tyto proměnné jako datové položky třídy.
public class Tabulka extends AbstractTableModel{
private Object [][] data;
String [] sloupce;
....
}

Jejich inicializaci provedeme v konstruktoru. Konstruktor bude explicitní, abychom mu mohli předat počet řádek a sloupců takto vytvořené tabulky.
public Tabulka(int rows, int columns) {
data=new Object[rows][columns];
sloupce=new String[columns];
...
}

Generování posloupnosti provedeme ve speciální metodě nazvané getPosloupnost(), popis sloupců v metodě Sloupce(). Obě metody budou vykonány v konstruktoru.
public Tabulka(int rows, int columns) {
data=new Object[rows][columns];
sloupce=new String[columns];
this.Sloupce();
this.getPosloupnost();
}


Zdrojový kód metod vypadá takto.
public void getPosloupnost()
{
for (int i=0;i<data.length;i++)
{
for (int j=0;j<data[0].length;j++)
{
data[i][j]=(i+1)*(j+1);
}
}
}
public void Sloupce()
{
sloupce[0]="Posloupnost 1";
sloupce[1]="Posloupnost 2";
sloupce[2]="Posloupnost 3";
sloupce[3]="Posloupnost 4";
sloupce[4]="Posloupnost 5";
}

Autor: Filip Koval
Štítky: Java
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Milan z IP 88.103.234.*** | 4.5.2013 18:31
nleze dědit z třidy: AbstractTableModel hází to chybu: cannot find sybmol(tento název proste java nezná.)


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel čtyři a tři