簡體   English   中英

具有多個字段的Java JTable對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM