2010-05-17 35 views

回答

1

對不起,但我不能看我怎麼可以得到指定行

好相關 MyBusinessObject情況下,你將需要添加的getRow(...)方法返回適當的業務對象。

我寫了一個通用的RowTableModel來做到這一點。然而,這是一個抽象類,您可以使用擴展RowTableModel的BeanTableModel。或者該示例向您展示瞭如何通過實現幾個方法來輕鬆擴展RowTableModel。

編輯:

以下兩行添加到該示例的末尾:

frame.setVisible(true); 
JButton first = model.getRow(0); 
System.out.println(first); 
+0

這似乎是一個正確的方式。一個關於用法的小問題:((RowTableModel )jtable.getModel())。getRow(row)? – kilonet 2010-05-18 07:18:47

+0

我沒有看到問題,但是我基於JButtonTableModel示例添加了一個上面的簡單示例。 – camickr 2010-05-18 16:16:48

0

您可以通過定義TableModel的實現來處理這個問題。 (http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html)您的TableModel類可以存儲您喜歡的數據。因此,例如,您可以擁有一個列表中的每個元素代表整行的對象列表。

+0

好的,如果是這樣,我怎麼才能按行索引獲取行模型?我看到的唯一合適的方法 - getValueAt()用於渲染和列相關。 – kilonet 2010-05-17 15:14:24

+0

請參閱我的解決方案:基礎數據結構是一個列表,其中列表索引是模型索引並獨立於視圖更改(例如,如果JTable已排序)。 – Adamski 2010-05-17 15:21:34

0
// Define underlying business object: 
public class MyBusinessObject { 
    private final int i; 
    private final double d; 
    private final String s; 

    public MyBusinessObject(int i, double d, String s) { 
    this.i = i; 
    this.d = d; 
    this.s = s; 
    } 

    public int getI() { return i; } 
    public double getD() { return d; } 
    public String getS() { return s; } 
} 

// Define TableModel implementation that "sits on" MyBusinessObject: 
public class MyTableModel extends AbstractTableModel { 
    private static final String[] COLUMN_NAMES = { "i", "d", "s" }; 
    private static final Class<?>[] COLUMN_CLASSES = { Integer.class, Double.class, String.class }; 

    static { 
    assert COLUMN_NAMES.length == COLUMN_CLASSES.length; 
    } 

    // Collection of business objects. Use ArrayList for efficient random access. 
    private final List<MyBusinessObject> bizObj = new ArrayList<MyBusinessObject>(); 

    // TableModel methods delegate through to collection of MyBusinessObject. 
    public int getColumnCount() { return COLUMN_NAMES.length; } 
    public String[] getColumnNames() { return COLUMN_NAMES; } 
    public Class<?>[] getColumnClasses() { return COLUMN_CLASSES; } 
    public Object getValueAt(int row, int col) { 
    Object ret; 
    MyBusinessObject bo = bizObj.get(row); 

    switch(col) { 
     case 1: 
     ret = bo.getI(); 
     break; 
     case 2: 
     ret = bo.getD(); 
     break; 
     case 3: 
     ret = bo.getS(); 
     break; 
     default: 
     throw new IllegalArgumentException("Invalid column index: " + col); 
    } 

    return ret; 
    } 

    // Additional methods for updating the collection. 
    public void addBusinessObject(MyBusinessObject bo) { 
    bizObj.add(bo); 
    int i = bizObj.size() - 1; 
    fireTableRowsInserted(i, i); 
    } 

    // ... etc. 
} 
+0

對不起,但我不明白我怎麼能得到MyBusinessObject實例與指定的行關聯你的例子 – kilonet 2010-05-17 18:09:27

1

我建議你看一看GlazedLists這將對於遵循Java組件的任何領域模型對象工作約定(getter/setter)。

文檔非常好,也有很好的例子。

如果您需要它,GlazedLists還會帶來其他有趣的功能(例如過濾)。