Класс определяет курсор как текущую позицию вида, предназначенную для вставки и удаления текста методом

Caret createCaret();

Опишем курсор подробнее.

Курсор

Курсор описан интерфейсом Caret и реализован классом DefaultCaret как тонкая вертикальная черта, отмечающая позицию между символами. Текущая позиция называется точкой (dot). Для работы с выделенным текстом отмечается еще одна позиция — другой конец выделенного текста — называемая меткой (mark). Пока выделения нет, метка совпадает с точкой. При перемещении точки методом moveDot (int) метка остается на месте и создается выделенный участок текста. При установке точки методом setDot (int) метка переносится в точку и выделение отменяется.

Выделенный текст можно отметить на экране или никак не отмечать. Это регулируется методом setSelectionVisible(boolean), а отслеживается логическим методом

isSelectionVisible().

Отследить положение точки и метки можно методами getDot ( ) и getMark (), возвращающими их линейную позицию в части Вид схемы MVC. Определить двумерную текущую позицию курсора можно методом

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.

Перейти на страницу:

Все книги серии В подлиннике

Похожие книги