2010-05-17 2 views

ответ

1

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

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

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

Edit:

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

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

кажется правильным. Один маленький вопрос об использовании: ((RowTableModel ) jtable.getModel()). GetRow (строка)? – kilonet

+0

Я не вижу вопроса, но я добавил простой пример выше, основанный на примере JButtonTableModel. – camickr

0

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

+0

OK, если да, как я могу получить строку-строку по индексу строки? Единственный подходящий метод, который я вижу - getValueAt() используется для рендеринга и столбца. – kilonet

+0

См. Мое решение. Основная структура данных - это список, в котором индекс списка является индексом модели и не зависит от изменения вида (например, если сортировка JTable). – Adamski

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

1

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

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

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

Смежные вопросы