Укрощение jTable. Часть 1. Вводная. Дело в шапке

Угораздило меня ввязаться в этот проект! Собственно задача не большая, а о бюджете вообще только поплакать хочется… А все этот экспириенс… Жадный я до него. Очень уж хотелось взяться за десктоп-приложение на java. Вроде бы как и не модно сейчас, и прошла уже эра настольных программ, и опыт разработки в этой области не маленький, и с джавою приходилось работать, но все больше по части веб сервисов. Вот и не утерпел…

В качестве рабочего инструмента мы остановились на NetBeans. Ну а в качестве библиотеки для разработки GUI — Swing. О нем и речь, а именно о контроле JTable. Немного разобравшись в инструментарии я аккуратненько уложил табличку на панель и взялся за дело.

Как и следовало ожидать, с визуальным редактором свойств не очень-то развернешься. Ну ручками, так ручками. Так даже интереснее. Итак, что нам нужно:

1) настроить колонки таблицы — заголовки, ширину;

2) заполнить таблицу данными;

3) нам нужна сортировка;

4) а потом хочется пораскрасить строчки (заказчик очень просил).

Начнем хотя бы с этого

Рисунок 1. С чего все начиналось

Ну что ж начнем с шапки таблицы и настройки колонок.

Естественно я тут не привожу реальных данных проекта. Таблицу периодических элементов Менделеева пока рисовать тоже не будем. А сделаем для примера табличку со списком дней рождений.

Все управление общим отображением и заполнением JTable данными выполняется с помощью класса TableModel. Т.е. задача оформления таблицы сводится к описанию TableModel. Предположим, что данные предварительно загружены в ArrayList, где каждый элемент — экземпляр вот такого замечательного класса Buddy.

public class Buddy {
  public int num;
  public String name;
  public Date birthDate;
  public String phone;
  public String email;
}
// Определяем список колонок
final String[] colNames = {"Номер", "Фамилия, имя, отчество", "Дата рожд.", "Телефон", "Email"};
// Описываем модель таблицы
TableModel myDataModel = new AbstractTableModel() {
  // тут все просто - это количество столбцов
  @Override
  public int getColumnCount() { return colNames.length; }
  // это количество строк (длина нашего ArrayList с данными)
  @Override
  public int getRowCount() { return alBuddies.size();}
  // здесь уже интереснее - метод возвращает данные для ячейки таблицы
  @Override
  public Object getValueAt(int row, int col) {
    Buddy buddy = (Buddy) alBuddies.get(row);
    switch (col) {
      case 0: return buddy.num;
      case 1: return buddy.name;
      case 2: return dateFormat.format(buddy.birthDate); // тут пришлось немного отформатировать дату
      case 3: return buddy.phone;
      case 4: return buddy.email;
      default: return "";
    }
  }
  // этот метод возвращает имена столбцов
  @Override
  public String getColumnName(int column) {return colNames[column];}
  // пока запрещаем редактирование данных в таблице, этим займемся позже
  @Override
  public boolean isCellEditable(int row, int col) {return false;}
  // оставляем как есть, потом вернемся
  @Override
  public void setValueAt(Object aValue, int row, int column) {}
  @Override
  public Class getColumnClass(int c) {return (String.class);}
};
// Говорим таблице какую модель использовать
tableBuddies.setModel(myDataModel);
Уже получше, но до идеала еще далеко

Уже получше, но до идеала еще далеко

Немного подкрутим ширину столбцов.

  tableBuddies.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
  tableBuddies.getColumnModel().getColumn(0).setPreferredWidth(80);
  tableBuddies.getColumnModel().getColumn(1).setPreferredWidth(300);

И подведем итог. Колонки настроены, заголовки столбцов прописаны, ширина столбцов настроена, данные в таблице отображаются.
Теперь можно заняться сортировкой. Т.е. продолжение следует…

Добавить комментарий


XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">