Класс определяет курсор как текущую позицию вида, предназначенную для вставки и удаления текста методом
Caret createCaret();
Опишем курсор подробнее.
Курсор
Курсор описан интерфейсом Caret и реализован классом DefaultCaret как тонкая вертикальная черта, отмечающая позицию между символами. Текущая позиция называется
Выделенный текст можно отметить на экране или никак не отмечать. Это регулируется методом setSelectionVisible(boolean), а отслеживается логическим методом
isSelectionVisible().
Отследить положение точки и метки можно методами getDot ( ) и getMark (), возвращающими их линейную позицию в части
Point getMagicCaretPosition();
а установить — методом
void setMagicCaretPosition(Point);
Во время перемещения курсора эта позиция имеет значение null.
Визуализация курсора осуществляется методом paint(Graphics). Класс DefaultCaret расширяет класс Rectangle, определяя прямоугольник, внутри которого вычерчивается курсор.
Мерцание курсора можно задать методом setBlinkRate(int), в котором указывается задержка в миллисекундах.
Курсор можно показать на экране или убрать его с экрана методом setVisible(true), а проследить за этим-логическим методом isVisible().
Изменение положения курсора вызывает событие ChangeEvent, которое обрабатывается обычным образом. Кроме того, курсор реагирует на события мыши и изменение фокуса ввода, при этом метод paint(Graphics) может изменить форму и цвет курсора.
Таким образом, библиотека Swing предоставляет все возможности для создания курсора любого вида.
Ограничение перемещения курсора
Подобно тому, как класс DocumentFilter отбирает символы перед занесением их в документ, класс NavigationFilter позволяет отследить перемещения курсора и выделения текста и ограничить их, например для того, чтобы не допустить выделения какого-то участка текста.
Для того чтобы задать ограничения курсору, надо расширить класс NavigationFilter, переопределив следующие его методы:
П void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) — определяет положение следующей позиции точки dot и метки курсора;
П void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) — определяет положение следующей позиции точки dot, оставляя метку на месте;
П int getNextVisualPositionFrom(JTextComponent tc, int pos, Position.Bias bias, int direction, Position.Bias[] biasRet) - вычисляет следующую позицию относительно
текущей позиции pos с учетом направления движения курсора direction. Стандартная реализация вызывает метод класса View с тем же названием.
После расширения класса NavigationFilter, вызванного переопределением методов, надо установить полученный ограничитель курсора в текстовый компонент методом
setNavigationFilter(NavigationFilter) класса JTextComponent.
Вот пример фильтра, ограничивающего перемещения курсора и область выделения текста первыми тридцатью символами.
class CursorFilter extends NavigationFilter{
public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias){ super.setDot(fb, (dot < 30)? dot:30, bias);
}
public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias){ super.moveDot(fb, (dot < 30)? dot:30, bias);
}
}
После этого определяем текстовый компонент и устанавливаем в него фильтр, например:
JTextArea ta = new JTextArea(5, 60); ta.setNavigationFilter(new CursorFilter());
Реализации редактора
Прямая реализация абстрактного класса EditorKit — класс DefaultEditorKit — кроме определения абстрактных методов вводит еще множество статических полей, задающих реакцию на нажатие специальных клавиш и перемещение курсора. Такой контроллер используется по умолчанию в компоненте JTextComponent.
Класс DefaultEditorKit расширяется классом StyledEditorKit. Этот класс позволяет внести в текст атрибуты, изменяющие стиль текста: шрифт, цвет, подчеркивание, курсив и другие. Такой редактор применяется по умолчанию в компоненте JTextPane.
От класса StyledEditorKit порождены два класса: HTMLEditorKit и RTFEditorKit, редактирующие тексты в форматах HTML и RTF. Возможности последнего класса пока сильно ограничены, а класс HTMLEditorKit собрал вокруг себя два пакета: javax.swing.text.html и j avax. swing. text. html .parser. Классы этих пакетов позволяют задать нестандартную интерпретацию тегов HTML, создать и применить описание DTD документа и таблицы стилей CSS, разработать свой интерпретатор (parser) документа HTML.