将模型类与JTable中的整行相关联

时间:2010-05-17 14:54:58

标签: java swing jtable

如何将我的模型类与JTable中的整行相关联,以便按行号获取模型类的链接?

4 个答案:

答案 0 :(得分:1)

  

抱歉,但我看不出怎样才能得到   MyBusinessObject实例关联   具有指定的行

好吧,您需要添加一个getRow(...)方法来返回相应的业务对象。

我写了一个通用的RowTableModel来做到这一点。它是一个抽象类,但是,您可以使用扩展RowTableModel的BeanTableModel。或者该示例向您展示了如何通过实现几种方法来轻松扩展RowTableModel。

编辑:

将以下两行添加到示例的末尾:

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

答案 1 :(得分:1)

我建议你看看GlazedLists哪个适用于遵循Java Beans约定(getter / setter)的任何Domain Model对象。

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

如果需要,GlazedLists还会带来其他有趣的功能(例如过滤)。

答案 2 :(得分:0)

您可以通过定义TableModel的实现来处理此问题。 (http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html)您的TableModel类可以随意存储您的数据。因此,例如,您可以拥有一个对象列表,其中列表中的每个元素代表整行。

答案 3 :(得分: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.
}