JTable
Nyní provedeme předefnování všech výše uvedených abstraktních metod třídy AbstractTableModel tak, aby poskytovaly použitelné výsledky.public int getRowCount() {return data.length;}
public int getColumnCount() {return data[0].length;}
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
Nastavení šířky sloupců. U tabulky často potřebujeme nastavit různé šířky sloupců v závislosti na typu zobrazovaných dat. K tomuto účelu slouží metoda etPreferredWidth(int sirka). Šířka je zadávána v pixelech. Metoda je volána pro konkrétní sloupec získaný metodou getColumn(int index).
t.getColumnModel().getColumn(0).setPreferredWidth(50);
Měnit šířku sloupců je též možno provádět prostřednictvím myši. Povolit či za kázat tuto možnost lze provést prostřednictvím metody setAutoResizeMode(int mode).
Mód | Popis |
AUTO_RESIZE_SUBSEQUENT_COLUMNS | Změna šířky sloupce tabulky, nemá vliv na sousední sloupce. |
AUTO_RESIZE_NEXT_COLUMN | Změna šířky sloupce na úkor šířky následujícího sloupce. |
AUTO_RESIZE_ALL_COLUMNS | Změna šířky sloupce ovlivní šířku všech ostatních sloupců. |
AUTO_RESIZE_LAST_COLUMN | Změna šířky sloupce na úkor šířky předchozího sloupce. |
AUTO_RESIZE_OFF | Šířku sloupce není možné měnit. |
Výběr řádků tabulky. V tabulce je možno označovat (tj. vybírat) řádky, se kterými můžeme v dalších krocích provádět různé manipulace. Existují tři mož nosti výběru (shodné s komponentou JList), lze je nastavit metodousetSelectionMode().
Detekci řádky/řádek, které byly vybrány, lze provést s využitím instance třídy ListSelectionModel. Vytvoříme instanci třídy ListSelectionModel, kterou inicializujeme prostřednictvím metody getSelectionModel().
ListSelectionModel vyber=t.getSelectionModel();
Při výběru řádky dochází k události ListSelection, pro práci s ní využijeme rozhraní ListSelectionListener. Zaregistrujeme posluchače
vyber.addListSelectionListener(new ListSelectionListener());
a následně implementujeme abstratktní metody rozhraní. V metodě vytvoříme inicializujeme odkaz třídy ListSelectionModel aktuálním modelem za použití metody getSource(). Na něj následně aplikujeme metodu isSelectionEmpty() sdělující, zda je výběr prázdný. Pokud není, získáme vybranou řádku metodou getMinSelectionIndex(). Postup je, jak vidíme, poměrně komplikovaný.
int radka;
vyber.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int radka;
ListSelectionModel ls=(ListSelectionModel) e.getSource();
if (!l.isSelectionEmpty()) radka=ls.getMinSelectionIndex()
}
});
Číslo vybrané řádky sdělíme v JLabelu, který na formulář přidáme. Kód upravíme, výsledek vypadá takto:
public class Tabulky3 extends JFrame{
private int radka;
private JLabel l;
public Tabulky3(int width, int height)
{
this.setSize(width, height);
this.setTitle("Tabulky");
l=new JLabel();
TableModel tm=new TabulkyDataAbstract(5,5);
JTable t=new JTable(tm);
this.setLayout(new GridLayout(1,2));
JScrollPane sp = new JScrollPane(t,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.getContentPane().add(l);
t.getColumnModel().getColumn(0).setPreferredWidth(50);
ListSelectionModel vyber = t.getSelectionModel();
t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
vyber.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel ls=(ListSelectionModel) e.getSource();
if (!ls.isSelectionEmpty())
{
radka=ls.getMinSelectionIndex();
l.setText("Vybrany radek:"+String.valueOf(radka+1));
}
}
});
t.setAutoResizeMode(t.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
this.getContentPane().add(sp);
this.setVisible(true);
}
}
Autor: Filip Koval