Tabela JTable, składająca się z kilku kolumn. W kolumnie 2 znajduje się
obiekt A, w pozostałych kolumnach inne informacje powiązane z tym obiektem.
W jaki sposób pobrać ten obiekt po kliknięciu w wiersz tabeli?
Wydaje mi się, że to nie trudne, ale pomysły mi się skończyły:/
Dzięki
Pozdrawiam
Dane pobierzesz z modelu tej tabeli. Pokaż model, to będę mógł
powiedzieć coś więcej.
Napewno z modelu ? W interfejsie TableModel nie ma zadnej informacji o
tym co bylo klikniete.
Tomek
Tak jak napisał Tomek, obiekt odczytasz z TableModel, natomiast aby
odczytać numer zaznaczonego wiersza skorzystaj np. z metody
getSelectedRow() z klasy JTable.
Pozdrawiam
Maciek
Tak przedstawia się mój TableModel:
import java.awt.Point;
import java.text.SimpleDateFormat;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class PotrzebaTableModel extends AbstractTableModel {
private Hashtable lookup;
private int rows;
private int columns;
private String headers[];
public PotrzebaTableModel(int rows, String columnHeaders[]) {
if ((rows < 0) || (columnHeaders == null)) {
throw new IllegalArgumentException(
"Invalid row count/columnHeaders");
}
this.rows = rows;
this.columns = columnHeaders.length;
headers = columnHeaders;
lookup = new Hashtable();
}
public PotrzebaTableModel(List dane, String columnHeaders[]) {
if ((dane.size() < 0) || (columnHeaders == null)) {
throw new IllegalArgumentException(
"Invalid row count/columnHeaders");
}
this.rows = dane.size();
this.columns = columnHeaders.length;
headers = columnHeaders;
lookup = new Hashtable();
Iterator it = dane.iterator();
int wiersz = 0;
SimpleDateFormat frm = new SimpleDateFormat("MM-dd-yyyy");
while (it.hasNext()) {
Potrzeba p = (Potrzeba) it.next();
//wpisanie danych do tabeli
setValueAt("", wiersz, 0);
setValueAt(frm.format(p.getData()), wiersz, 1);
setValueAt(p, wiersz, 2);
setValueAt(p.getPriorytet(), wiersz, 3);
setValueAt(p.getKoszt(), wiersz, 4);
setValueAt(p.getUwagi(), wiersz, 5);
setValueAt(p.isZrealizowana(), wiersz, 6);
wiersz++;
}
}
public int getColumnCount() {
return columns;
}
public int getRowCount() {
return rows;
}
@Override
public String getColumnName(int column) {
return headers[column];
}
public Object getValueAt(int row, int column) {
return lookup.get(new Point(row, column));
}
@Override
public void setValueAt(Object value, int row, int column) {
if ((rows < 0) || (columns < 0)) {
throw new IllegalArgumentException("Invalid row/column
setting");
}
if ((row < rows) && (column < columns)) {
lookup.put(new Point(row, column), value);
}
}
}
Tylko tak teraz patrzę na twój model i czytam oryginalne pytanie:
> Tabela JTable, składająca się z kilku kolumn. W kolumnie 2 znajduje się
> obiekt A, w pozostałych kolumnach inne informacje powiązane z tym obiektem.
twój model nie odzwierciedla czegoś takiego. Model napisałeś tak, że
jest mapa która dla każdego [x,y] przechowuje jakąś wartość. Skoro w
różnych kolumnach tego samego wiersza są powiązane ze sobą informacje,
to skąd one pochodzą i dlaczego model tabeli nie odpowiada modelowi
danych?
Tak czy inaczej, reasumując: model tabeli nic nie wie o tym, że
poszczególne wiersze stanowią jakąś całość. Są tam powstawiane, osobno
w każdą komórkę, wartości. Przepisz model tak, żeby każdy wiersz
reprezentował sobą coś spójnego - jakiś obiekt, wtedy będziesz miał
możliwość wyciągania dowolnych informacji na podstawie numeru wiersza.
Najprościej - zastąp Hashtable na List<Coś>, gdzie Coś to jest
reprezentacja jednego wiersza. Metody setValue/getValue będą wtedy
działać tak, np:
Person p = list.get(row);
switch (column) {
case 0: return p.getNazwisko();
case 1: return p.getImie();
... i tak dalej...
Teraz, jak klikniesz na wiersz tabeli, wyciągniesz numer wiersza. W
modelu dodasz metodę w stylu:
public Person getPerson(int row) { return list.get(row); }
dzięki czemu, na swoje potrzeby, będziesz mógł pobrać całe "Coś" mając
tylko numer wiersza i zrobić z tym czymś co ci się tylko podoba.
Dziękuję za pomoc w zrozumieniu działania TableModel. Działa dokładnie
tak jak bym chciał.