Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[newbie] Pobieranie obiektu z tabeli JTable.

418 views
Skip to first unread message

TomaszB

unread,
Jan 5, 2010, 7:28:28 AM1/5/10
to
Czytam i czytam i jakoś nie potrafię sam dojść do rozwiązania.

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

Witold Szczerba

unread,
Jan 5, 2010, 8:18:41 AM1/5/10
to


Dane pobierzesz z modelu tej tabeli. Pokaż model, to będę mógł
powiedzieć coś więcej.

Tomek Banach

unread,
Jan 5, 2010, 11:33:35 AM1/5/10
to

Napewno z modelu ? W interfejsie TableModel nie ma zadnej informacji o
tym co bylo klikniete.

Tomek

Maciek Kożuch

unread,
Jan 5, 2010, 12:15:17 PM1/5/10
to

Tak jak napisał Tomek, obiekt odczytasz z TableModel, natomiast aby
odczytać numer zaznaczonego wiersza skorzystaj np. z metody
getSelectedRow() z klasy JTable.

Pozdrawiam
Maciek

TomaszB

unread,
Jan 6, 2010, 2:53:02 AM1/6/10
to
W dniu 05.01.2010 14:18, Witold Szczerba pisze:

> Dane pobierzesz z modelu tej tabeli. Pokaż model, to będę mógł
> powiedzieć coś więcej.

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);
}
}
}

Witold Szczerba

unread,
Jan 6, 2010, 3:50:06 AM1/6/10
to
Jak napisał Maciek, samo sprawdzenie który wiersz został kliknięty
możesz sprawdzić wywołując jTable.getSelectedRow(), ale musisz
wiedzieć, że tabela która ma włączone sortowanie będzie zwracała swój
inny numer wiersza niż ten z modelu. Dlatego take selectedRow, jak
chcesz wykorzystać do odwołania do modelu, musisz przekonwertować
korzystając z metody JTable#convertRowIndexToModel(int i).

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.

TomaszB

unread,
Jan 6, 2010, 9:19:07 AM1/6/10
to
W dniu 06.01.2010 09:50, Witold Szczerba pisze:

> 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ł.

0 new messages