HotLog

суббота, 18 сентября 2010 г.

Проверка SwingThreadPolicy в рамках всего приложения.

Идея в использовании JavaAgent и инструментаций. Мы добавляем к коду методов проверяемых классов код, проверяющий поток. В данном случае мы инструментируем все наследники java.awt.Component.

Код написан на скале:





пятница, 3 сентября 2010 г.

Написание собственного TableCellEditor на базе JSpinner.

Часто возникает необходимость обеспечить удобный ввод чисел в ячейку таблицы. В виду того, что компонент JSpinner написан, существует в стандартной поставке и работает, хочется использовать именно его.
Здесь полезно знать следующее:

  1. По окончанию редактирования editor обязан вызывать на всех слушателях либо editingStopped либо editingCanceled
  2. Editor должен закончить редактирование (см. предыдущий пункт), если на нем вызвали метод cancelCellEditing или если он возвращает true на вызов метода stopCellEditing
  3. Если editor сигнализирует об окончании редактирования вызывая на слушателях editingStopped, это означает, что он готов предоставить новое значение по вызову метода getCellEditorValue
  4. Если editor сигнализирует об окончании редактирования вызывая на слушателях editingCanceled, это означает, что у него нет нового значения (и в модель ничего нового проставлять не надо)
  5. Так как таблица удалит своего слушателя сразу после того, как будет просигнализировано об окончании редактирования, можно не бояться вызывать на всех слушателях editingStopped или editingCanceled по несколько раз. Это позволит сделать код более понятным и простым.


Таким образом, если на editor'e вызвали метод cancelCellEditing, он обязан уведомить всех слушателей об окончании редактирования до выхода из метода (напоминаю, swing однопоточный). То же верно, если он собирается вернуть true из stopCellEditing.

Класс:


И тест к нему (требуется hamcrest 1.2, jmock, junit, fest-swing):