Jak można odświeżyć Data Model dla JTable - tzn chcemy by po kliknięciu użytkownik mógł np. zmienić ilość kolumn i ich typ?
:) napisał(a)
Jak można odświeżyć Data Model dla JTable - tzn chcemy by po kliknięciu użytkownik mógł np. zmienić ilość kolumn i ich typ?
Dokumentacja javy - jest metoda addColumn ,
http://java.sun.com/javase/6/docs/api/javax/swing/JTable.html
http://java.sun.com/javase/6/docs/api/javax/swing/table/TableColumn.html
Przykłady użycia JTable
http://www.codeguru.com/java/Swing/JTable/index.shtml
http://www.exampledepot.com/egs/javax.swing.table/pkg.html
Dzięki za wszystkie linki, ale nie o to mi chyba chodziło [???]. Może objaśnię lepiej tym bardziej. Tabele tworzy się na pewnym modelu danych (pobieranych np. z bazy danych przez jdbc i zastosowanie zapytania). W takim wypadku modyfikacja wychodzi daleko poza dodanie kolumny. I cały problem jest w tym, że nie mam pojęcia jak załadować inny schemat i przeładować JTable by wyświetlał inny result. Szukałem na stronie suna i nie tylko, jedyne co znalazłem do TableListenery, ale to chyba nie do tego pasuje :(
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import javax.swing.table.AbstractTableModel;
public class MainWindow {
private JFrame frame = new JFrame("Okno");
private JButton b1 = new JButton("Click me");
private JPanel p1 = new JPanel();
private String[] nag = { "1", "2" };
private String[][] dane = { {"1", "2"},
{"1", "2"} };
private JTable table = new JTable();
private JScrollPane js = new JScrollPane();
/* Inicjacja GUI */
public MainWindow()
{
p1 = new JPanel();
p1.setLayout(new GridLayout(2,1));
ModelTabelki model = new ModelTabelki( dane, nag );
table = new JTable( model );
js = new JScrollPane( table );
p1.add(js);
p1.add(b1);
b1.addMouseListener( new MouseAdapter(){
public void mouseClicked(MouseEvent e){
String[] nag2 = { "1", "2","3" };
String[][] dane2 = { {"1", "2","3"},
{"1", "2","3"} };
table.setModel(new ModelTabelki(dane2,nag2));
};
});
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.add(p1);
frame.setVisible(true);
}
/* Najważniejsza rzecz poprawny Model !! */
/* Wszystkie funkcjie są ważne */
class ModelTabelki extends AbstractTableModel
{
Object[][] data;
Object[] naglowek;
public ModelTabelki(Object[][] dat, Object[] nag){
data = dat;
naglowek = nag;
}
public int getColumnCount() {
if(naglowek!=null)
return naglowek.length;
return 0;
}
public int getRowCount() {
if(data!=null)
return data.length;
return 0;
}
public String getColumnName(int col) {
return naglowek[col].toString();
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
}
public static void main(String[] args)
{
new MainWindow();
}
}
To powinno Ci pomoc
Ehh zapomniałem dodać komentarz.
Jest to jeden ze sposobow na JTable( ja takiego modelu uzywam ) moze nie jest najladniejszy, najefektywniejszy no ale coz.
Najwazniejsze to poprawne zdefiniowanie AbstractTableModel musi zawierac podstawowe funkcje takie jak
-> Konstruktor
-> getColumnCount()
-> getRowCount()
-> getColumnName(int col)
-> getValueAt(int row, int col)
sa one niezbedne do poprawnego dzialania.
Reszte raczej zrozumiesz na tym prostym przykladzie.
Aha kompilowalem w Eclipse z java w ver 1.5.
Dzięki za odpowiedź. Wystarczyłoby podanie metody setModel( Nie wiem jak mogłem ją przeoczyć przeglądając javadoc.) :D, ale to też się przyda.