AbstractTableModel учебник

Я работаю над проектом, который должен показать некоторые данные на jtable. Я нашел много учебных пособий по jtables, но мало о том, как настроить AbstractTableModel, большинство частей - готовый код. Даже на странице Oracle я нашел это общее руководство по jtable, но мало информации о AbstractTableModel и о том, как создать индивидуальную модель. Oracle Jtable Tutorial Я новичок в программировании, поэтому буду обучением для моего уровня навыков. Заранее благодарю.

1 ответ

Решение

AbstractTableModel содержит три метода, которые необходимо перезаписать. Это:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

JTable использует эти методы для определения количества полей (строк и столбцов) и для получения значения (как типа Object) для каждого поля. Когда вы переписываете эти методы, вам решать, какой тип данных вы хотите использовать. Например, вы можете использовать двумерный массив объектов:

Object[][] data;

или ArrayList или Hashtable:

List<Object[]> data = new ArrayList<Object[]>();

Массив фиксированных размеров может быть проще в использовании, но сложнее динамически добавлять значения. Конечно, вы также можете использовать Карты или другие структуры данных. Вам просто нужно настроить реализацию этих трех методов, чтобы вернуть правильную информацию из вашей структуры данных, например, сколько строк содержит ваша модель в настоящее время и т. Д.

Есть также еще пара методов, которые могут быть перезаписаны, но не обязательны, например, если вы хотите иметь собственные имена столбцов, вы должны дополнительно перезаписать public String getColumnName(int col) метод. Например, вот так:

private static final String[] COLUMN_NAMES = {"User", "Password", "Age"};
public String getColumnName(int col) {
    return COLUMN_NAMES[col];
}

Посмотрите на Javadoc для AbstractTableModel, чтобы получить обзор других методов, которые могут быть перезаписаны.

Если вы хотите иметь возможность изменять данные в вашей TableModel, то вам нужно перезаписать setValueAt метод (если я не ошибаюсь):

void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    //depending on your data structure add the aValue object to the specified
    //rowIndex and columnIndex position in your data object
    //notify the JTable object:
    fireTableCellUpdated(row, col);
}

Важное замечание: Каждый раз, когда вы добавляете или удаляете строку, соответствующая функция в вашей реализации TableModel должна вызывать соответствующую функцию fireTableRowsInserted (или удаленную). В противном случае вы увидите странные визуальные эффекты с вашим JTable:

public void addRow(Object[] dates) {
    data.add(dates);
    int row = data.indexOf(dates);
    for(int column = 0; column < dates.length; column++) {
        fireTableCellUpdated(row, column);
    }
    fireTableRowsInserted(row, row);
}
Другие вопросы по тегам