[英]Java JTable object with multiple fields
我有一個具有X個字段的對象。 我的JTable中的每一行對應一個項目。 行中的每一列代表該項的字段。 我還需要保持對項目的引用(該項目也有唯一的ID字段),這樣我就可以確定所選單元格中的項目。
首選方法是將實際對象放在表格中的每個單元格中,並使用各種渲染器顯示項目或簡單地將字段值放在每個單元格中,並使用具有項目ID的隱藏列,我可以我需要知道物品ID時的參考?
謝謝,傑夫
我會編寫一個自定義表模型(而不是試圖將您的設計變為默認的表模型實現)。 然后,該模型保存您的實際對象,並在其方法實現(例如getValueAt
)中,將每個字段視為一列。
簡單的例子(未經過測試,但應該很好地說明這個想法):
import java.util.List;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
/**
* Simple table model for displaying properties common to all objects.
* Note that all methods must run inside the event dispatch thread.
*/
public class ObjectPropertyTableModel extends AbstractTableModel {
private final List<Object> objects = new ArrayList<Object>();
public void addObject(Object obj) {
addObject(obj, objects.size());
}
public void addObject(Object obj, int index) {
objects.add(index, obj);
fireTableRowsInserted(index, index);
}
public void removeObject(Object obj) {
int index = objects.indexOf(obj);
objects.remove(index);
fireTableRowsDeleted(index, index);
}
public Object getObject(int rowIndex) {
return objects.get(rowIndex);
}
@Override
public int getRowCount() {
return objects.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0: return "toString";
case 1: return "hashCode";
case 2: return "class";
default: throw new IndexOutOfBoundsException();
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return String.class;
case 1: return Integer.class;
case 2: return Class.class;
default: throw new IndexOutOfBoundsException();
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object obj = objects.get(rowIndex);
switch (columnIndex) {
case 0: return obj.toString();
case 1: return obj.hashCode();
case 2: return obj.getClass();
default: throw new IndexOutOfBoundsException();
}
}
}
您可以使用Bean表模型 。 如果沒有,那么JButtonTableModel示例顯示了如何實現getValueAt / setValueAt()方法並利用RowTableModel提供的功能,因此您無需從頭開始創建TableModel。
我首選的方法是建立一個表模型,從每個列的字段中返回一個值。 為了能夠獲得對象的引用,我向模型添加了一個可以稱為getObjectFromRow的方法,顧名思義,它返回對應於行索引的對象。 這樣,您可以在單元格中顯示實際顯示的數據,並且不需要隱藏列來獲取對行對象的引用。 當然這需要一個自定義表模型,但我認為這是值得的麻煩。
當然,使用渲染器來顯示來自正確字段的數據也是可能的,但根據我的經驗,這有幾個問題,包括為不同數據類型編寫所有渲染器的麻煩,以及從表中復制和粘貼不起作用的事實開箱即用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.