Связать класс модели со всей строкой в ​​JTable - PullRequest
0 голосов
/ 17 мая 2010

Как я могу связать свой класс модели со всей строкой в ​​JTable, чтобы получить ссылку на класс модели по номеру строки?

Ответы [ 4 ]

1 голос
/ 18 мая 2010

Я бы посоветовал вам взглянуть на GlazedLists , который будет работать для любого объекта доменной модели, который следует соглашениям Java Beans (getter / setter).

Документация очень хорошая, и есть хорошие примеры.

GlazedLists также предоставляет другие интересные функции (например, фильтрацию), если они вам нужны.

1 голос
/ 18 мая 2010

Извините, но я не вижу, как я могу получить Экземпляр MyBusinessObject связан с указанным рядом

Что ж, вам нужно добавить метод getRow (...) для возврата соответствующего бизнес-объекта.

Я написал универсальный RowTableModel, который делает это. Это абстрактный класс, однако, вы можете использовать BeanTableModel , который расширяет RowTableModel. Или пример показывает, как легко расширить RowTableModel, реализовав несколько методов.

Edit:

Добавьте следующие две строки в конец примера:

frame.setVisible(true);
JButton first = model.getRow(0);
System.out.println(first);
0 голосов
/ 17 мая 2010
// 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 голосов
/ 17 мая 2010

Вы справляетесь с этим, определяя реализацию TableModel. (http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html) Ваш класс TableModel может хранить ваши данные так, как вам нравится. Так, например, у вас может быть список объектов, где каждый элемент в списке представляет всю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...