Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Используя текстовые Компоненты
Текстовые Компонентные Функции
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Текстовые Компонентные Функции

JTextComponent class является основой для текстовых компонентов Swing. Этот class обеспечивает следующие настраиваемые функции всех его потомков:

См. вызванный пример TextComponentDemo исследовать эти возможности. Хотя TextComponentDemo пример содержит специализированный экземпляр JTextPane, возможности, обсужденные в этом разделе, наследованы всеми JTextComponent подклассы.

Снимок TextComponentDemo, который содержит специализированную текстовую область и стандартную текстовую область

Верхний текстовый компонент является специализированной текстовой областью. Более низкий текстовый компонент является экземпляром JTextArea, который служит журналом, который сообщает обо всех изменениях, произведенных в содержании текстовой области. Строка состояния у основания окна сообщает или о расположении выбора или о позиции каре, в зависимости от того, выбирается ли текст.


Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, TextComponentDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает Приложение TextComponentDemo
  2. Используйте мышь, чтобы выбрать текст и поместить курсор в текстовую область. Информация о выборе и курсоре выводится на экран у основания окна.
  3. Введите текст, вводя на клавиатуре. Можно переместить каре вокруг использования клавиш со стрелками на клавиатуре или четырех emacs привязках клавиш: Ctrl-B (назад один символ), Ctrl-F (передают один символ), Ctrl-N (вниз одна строка), и Ctrl-P (одна строка).
  4. Откройте меню Edit, и используйте его пункты меню, чтобы отредактировать текст в текстовой области. Сделайте выбор в текстовой области у основания окна. Поскольку текстовая область не доступна для редактирования, только некоторые из команд меню Edit, как копия к буферу обмена, работа. Важно отметить, хотя, что меню работает на обоих текстовых компонентах.
  5. Используйте элементы в меню Style, чтобы применить различные стили к тексту в текстовой области.

Используя TextComponentDemo пример как контрольная точка, этот раздел затрагивает следующие темы:

Соединение текстовых Действий С Меню и Кнопками

Все текстовые компоненты Swing поддерживают стандартные команды редактирования такой как сокращено, копируют, вставляют, и вставляют символы. Каждая команда редактирования представляется и реализуется Action объект. (Чтобы узнать больше о действиях видят, Как Использовать Действия.) Действия позволяют Вам связывать команду с компонентом GUI, таким как пункт меню или кнопка, и поэтому создавать GUI вокруг текстового компонента.

Можно вызвать getActions метод на любом текстовом компоненте, чтобы принять массив, содержащий все действия, поддерживаемые этим компонентом. Также возможно загрузить массив действий в a HashMap таким образом, Ваша программа может получить действие по имени. Вот код от TextComponentDemo пример, который предпринимает меры из текста, разделяет на области, и загружает их в a HashMap.

private HashMap<Object, Action> createActionTable(JTextComponent textComponent) {
        HashMap<Object, Action> actions = new HashMap<Object, Action>();
        Action[] actionsArray = textComponent.getActions();
        for (int i = 0; i < actionsArray.length; i++) {
            Action a = actionsArray[i];
            actions.put(a.getValue(Action.NAME), a);
        }
        return actions;
    }

Вот метод для того, чтобы получить действие его именем из карты хеша:

private Action getActionByName(String name) {
    return actions.get(name);
}

Можно использовать оба метода дословно в Ваших программах.

Следующие шоу кода, как пункт меню сокращения создается и связывается с действием удаления текста от текстового компонента.

protected JMenu createEditMenu() {
    JMenu menu = new JMenu("Edit");
    ...
    menu.add(getActionByName(DefaultEditorKit.cutAction));
    ...

Этот код получает действие, по имени используя удобный метод, показанный ранее. Это тогда добавляет действие к меню. Это - все, что Вы должны сделать. Меню и действие заботятся обо всем остальном. Отметьте, что название действия происходит от DefaultEditorKit. Этот набор обеспечивает действия для основного редактирования текста и является суперклассом для всех наборов редактора, обеспеченных Swing. Таким образом, его возможности доступны всем текстовым компонентам, если thay не переопределяются настройкой.

Для эффективности текстовые компоненты совместно используют действия. Action объект, возвращенный getActionByName(DefaultEditorKit.cutAction) совместно используется недоступным для редактирования JTextArea у основания окна. У этой характеристики совместного использования есть два важных разветвления:

Вот код, который создает меню Style и помещает пункт меню Bold в это:

protected JMenu createStyleMenu() {
    JMenu menu = new JMenu("Style");
 
    Action action = new StyledEditorKit.BoldAction();
    action.putValue(Action.NAME, "Bold");
    menu.add(action);
    ...

StyledEditorKit обеспечивает Action подклассы, чтобы реализовать команды редактирования для стилизованного текста. Вы отметите, что вместо того, чтобы получить действие от набора редактора, этот код создает экземпляр BoldAction class. Таким образом это действие не совместно используется ни с каким другим текстовым компонентом, и изменять его название не будет влиять ни на какой другой текстовый компонент.

Соединение текстовых Действий С Нажатиями клавиш

В дополнение к соединению действия с компонентом GUI можно также связать действие с нажатием клавиши при использовании текстовой компонентной входной карты. Входные карты описываются в том, Как Использовать Привязки клавиш.

Текстовая область в TextComponentDemo пример поддерживает четыре привязки клавиш, не обеспеченные по умолчанию.

Следующий код добавляет привязку клавиш Ctrl-B к текстовой области. Код для того, чтобы добавить другие три упомянутую выше привязки подобен.

InputMap inputMap = textPane.getInputMap();

KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_B,
                                       Event.CTRL_MASK);
inputMap.put(key, DefaultEditorKit.backwardAction);

Во-первых, код получает текстовую компонентную входную карту. Затем, это находит a KeyStroke объект, представляющий сочетание клавиш Ctrl-B. Наконец, код связывает нажатие клавиши с Action это перемещает курсор назад.

Реализация Отмены и Восстановления

У реализации отмены и восстановления есть две части:

Часть 1: Запоминание Невыполнимых Редактирований
Чтобы поддерживать отмену и восстановление, текстовый компонент должен помнить каждое редактирование, которое происходит, порядок редактирований, и что необходимо, чтобы отменить каждое редактирование. Пример программы использует экземпляр UndoManager class, чтобы управлять его списком невыполнимых редактирований. Менеджер по отмене создается, где задействованные переменные объявляются:

protected UndoManager undo = new UndoManager();

Теперь, давайте смотреть на то, как программа обнаруживает невыполнимые редактирования и добавляет их к менеджеру по отмене.

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

doc.addUndoableEditListener(new MyUndoableEditListener());

Невыполнимый слушатель редактирования, используемый в нашем примере, добавляет редактирование к списку менеджера по отмене:

protected class MyUndoableEditListener
          implements UndoableEditListener {
    public void undoableEditHappened(UndoableEditEvent e) {
        //Remember the edit and update the menus
        undo.addEdit(e.getEdit());
        undoAction.updateUndoState();
        redoAction.updateRedoState();
    }
}  

Отметьте, что этот метод обновляет два объекта: undoAction и redoAction. Они - объекты действия, присоединенные к пунктам меню Undo и Redo, соответственно. Следующий шаг показывает Вам, как создать пункты меню и как реализовать эти два действия. Для получения общей информации о невыполнимых слушателях редактирования и невыполнимых событиях редактирования, см., Как Записать Невыполнимому Слушателю Редактирования.


Отметьте: 

По умолчанию каждое невыполнимое редактирование отменяет единственную символьную запись. Это возможно с некоторым усилием сгруппировать редактирования так, чтобы ряд нажатий клавиш был объединен в одно невыполнимое редактирование. Группировка редактирований этим способом потребовала бы, чтобы Вы определили class, который прерывает невыполнимые события редактирования из документа, комбинируя их если соответствующий и передающий результаты Вашему невыполнимому слушателю редактирования.


Часть 2: Реализация Команд Отмены и Восстановления
Первый шаг в реализации отмены и восстановления должен создать действия, чтобы вставить меню Edit.

JMenu menu = new JMenu("Edit");

//Undo and redo are actions of our own creation
undoAction = new UndoAction();
menu.add(undoAction);

redoAction = new RedoAction();
menu.add(redoAction);
...

Отмена и действия восстановления реализуются пользовательским AbstractAction подклассы: UndoAction и RedoAction, соответственно. Эти классы являются внутренними классами основного class примера.

Когда пользователь вызывает undo команда, actionPerformed метод UndoAction class вызывают:

public void actionPerformed(ActionEvent e) {
    try {
        undo.undo();
    } catch (CannotUndoException ex) {
        System.out.println("Unable to undo: " + ex);
        ex.printStackTrace();
    }
    updateUndoState();
    redoAction.updateRedoState();
}

Это вызовы метода менеджер по отмене undo метод и обновления пункты меню, чтобы отразить новое состояние отмены/восстановления.

Точно так же, когда пользователь вызывает redo команда, actionPerformed метод RedoAction class вызывают:

public void actionPerformed(ActionEvent e) {
    try {
        undo.redo();
    } catch (CannotRedoException ex) {
        System.out.println("Unable to redo: " + ex);
        ex.printStackTrace();
    }
    updateRedoState();
    undoAction.updateUndoState();
}

Этот метод подобен отмене, за исключением того, что это вызывает менеджера по отмене redo метод.

Большая часть кода в UndoAction и RedoAction классы выделяются включению и отключению действий как соответствующие из текущего состояния, и изменять названия пунктов меню, чтобы отразить редактирование, которое будет отменено или сделано заново.


Отметьте: 

Реализация отмены и восстановления в TextComponentDemo пример был взят от NotePad демонстрационный пример, который идет с программным обеспечением JDK. Много программистов также будут в состоянии скопировать эту реализацию отмены/восстановления без модификации.


Понятия: О Документах

Как другие компоненты Swing, текстовый компонент разделяет свои данные (известный как модель) от его представления данных. Если Вы еще не знакомы с разделением представления модели, используемым компонентами Swing, обратитесь к Использованию Моделей.

Текстовая компонентная модель известна как документ и является экземпляром class, который реализует Document интерфейс. Документ предоставляет следующие услуги для текстового компонента:

Текстовый пакет Swing содержит подынтерфейс Document, StyledDocument, это добавляет поддержку повышения текста со стилями. Один JTextComponent подкласс, JTextPane, требует, чтобы его документ был a StyledDocument вместо просто a Document.

javax.swing.text пакет обеспечивает следующую иерархию классов документа, которые реализуют специализированные документы для различного JTextComponent подклассы:

Иерархия классов документа, которые обеспечивает javax.swing.text.

A PlainDocument документ значения по умолчанию для текстовых полей, полей пароля, и текстовых областей. PlainDocument обеспечивает основной контейнер для текста, где весь текст выводится на экран в том же самом шрифте. Даже при том, что область редактора является стилизованным текстовым компонентом, она использует экземпляр PlainDocument по умолчанию. Документ значения по умолчанию для стандарта JTextPane экземпляр DefaultStyledDocument — контейнер для стилизованного текста ни в каком определенном формате. Однако, экземпляр документа, используемый любой определенной областью редактора или текстовой областью, зависит от типа контента, связанного с этим. Если Вы используете setPage метод, чтобы загрузить текст в область редактора или текстовую область, экземпляр документа, используемый областью, мог бы измениться. Обратитесь к тому, Как Использовать Редактора Пэйнса и текстовые Области для деталей.

Хотя можно установить документ текстового компонента, обычно легче позволить этому устанавливать автоматически, и в случае необходимости, использовать фильтр документа, чтобы измениться, как текстовые компонентные данные устанавливаются. Можно реализовать определенные настройки или устанавливая фильтр документа или заменяя текстовый компонентный документ одним собственным. Например, текстовая область в TextComponentDemo у примера есть фильтр документа, который ограничивает число символов, которые может содержать текстовая область.

Реализация Фильтра Документа

Чтобы реализовать фильтр документа, создайте подкласс DocumentFilter и затем присоедините это к документу, используя setDocumentFilter метод, определенный в AbstractDocument class. Хотя возможно иметь документы, которые не убывают от AbstractDocument, по умолчанию текстовое компонентное использование Swing AbstractDocument подклассы для их документов.

TextComponentDemo у приложения есть фильтр документа, DocumentSizeFilter, это ограничивает число символов, которые может содержать текстовая область. Вот код, который создает фильтр и присоединяет его к текстовому документу области:

...//Where member variables are declared:
JTextPane textPane;
AbstractDocument doc;
static final int MAX_CHARACTERS = 300;
...
textPane = new JTextPane();
...
StyledDocument styledDoc = textPane.getStyledDocument();
if (styledDoc instanceof AbstractDocument) {
    doc = (AbstractDocument)styledDoc;
    doc.setDocumentFilter(new DocumentSizeFilter(MAX_CHARACTERS));
} 

Ограничить символы, позволенные в документе, DocumentSizeFilter переопределения DocumentFilter class insertString метод, который вызывают каждый раз, когда текст вставляется в документ. Это также переопределяет replace метод, который, наиболее вероятно, вызовут, когда пользователь вставит в новом тексте. Вообще, вставка текста может закончиться когда пользовательские типы или вставки в новом тексте, или когда setText метод вызывают. Вот DocumentSizeFilter Реализация class insertString метод:

public void insertString(FilterBypass fb, int offs,
                         String str, AttributeSet a)
    throws BadLocationException {

    if ((fb.getDocument().getLength() + str.length()) <= maxCharacters)
        super.insertString(fb, offs, str, a);
    else
        Toolkit.getDefaultToolkit().beep();
}

Код для replace подобно. FilterBypass параметр к методам, определенным DocumentFilter class является просто объектом, который позволяет документу быть обновленным ориентированным на многопотоковое исполнение способом.

Поскольку предыдущий фильтр документа касается дополнений к данным документа, он только переопределяет insertString и replace методы. Большинство фильтров документа переопределило бы DocumentFilter's remove метод также.

Прислушивание к Изменениям на Документе

Можно зарегистрировать два различных типов слушателей на документе: слушатели документа и невыполнимые слушатели редактирования. Этот подраздел описывает слушателей документа. Для получения информации о невыполнимых слушателях редактирования обратитесь к Реализации Отмены и Восстановления.

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

TextComponentDemo программа использует слушателя документа, чтобы обновить журнал изменений всякий раз, когда изменение производится в текстовой области. Следующая строка кодовых регистров экземпляр MyDocumentListener class как слушатель на текстовом документе области:

doc.addDocumentListener(new MyDocumentListener());

Вот реализация MyDocumentListener class:

protected class MyDocumentListener implements DocumentListener {
    public void insertUpdate(DocumentEvent e) {
        displayEditInfo(e);
    }
    public void removeUpdate(DocumentEvent e) {
        displayEditInfo(e);
    }
    public void changedUpdate(DocumentEvent e) {
        displayEditInfo(e);
    }
    private void displayEditInfo(DocumentEvent e) {
            Document document = (Document)e.getDocument();
            int changeLength = e.getLength();
            changeLog.append(e.getType().toString() + ": "
                + changeLength + " character"
                + ((changeLength == 1) ? ". " : "s. ")
                + " Text length = " + document.getLength()
                + "." + newline);
    }
} 

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

Помните, что фильтр документа для этой текстовой области ограничивает число символов, позволенных в документе. Если Вы пытаетесь добавить больше текста, чем фильтр документа позволяет, фильтр документа блокирует изменение и слушатель insertUpdate метод не вызывают. Слушатели документа уведомляются относительно изменений, только если изменение уже произошло.

Можно хотеть изменить текст документа в пределах слушателя документа. Однако, никогда недопустимо изменять содержание текстового компонента изнутри слушателя документа. Если Вы сделаете, то программа будет вероятная мертвая блокировка. Вместо этого можно использовать отформатированное текстовое поле или обеспечить фильтр документа.

Прислушивание к Изменениям Каре и Выбора

TextComponentDemo программа использует слушателя каре, чтобы вывести на экран текущую позицию каре или, если текст выбирается, степень выбора.

Слушатель каре class в этом примере является a JLabel подкласс. Вот код, который создает метку слушателя каре и делает ее слушателем каре текстовой области:

//Create the status area
CaretListenerLabel caretListenerLabel = new CaretListenerLabel(
                                                "Caret Status");
...
textPane.addCaretListener(caretListenerLabel);

Слушатель каре должен реализовать один метод, caretUpdate, который вызывают каждый раз перемещениями каре или изменениями выбора. Вот CaretListenerLabel реализация caretUpdate:

public void caretUpdate(CaretEvent e) {
    //Get the location in the text
    int dot = e.getDot();
    int mark = e.getMark();
    if (dot == mark) {  // no selection
        try {
            Rectangle caretCoords = textPane.modelToView(dot);
            //Convert it to view coordinates
            setText("caret: text position: " + dot +
                    ", view location = [" +
                    caretCoords.x + ", " + caretCoords.y + "]" +
                    newline);
        } catch (BadLocationException ble) {
            setText("caret: text position: " + dot + newline);
        }
     } else if (dot < mark) {
        setText("selection from: " + dot + " to " + mark + newline);
     } else {
        setText("selection from: " + mark + " to " + dot + newline);
     }
}

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

Как со слушателями документа, слушатель каре пассивен. Это реагирует на изменения в каре или в выборе, но не изменяет каре или выбор непосредственно. Если Вы хотите изменить каре или выбор, используйте фильтр навигации или пользовательское каре.

Реализация фильтра навигации подобна реализации фильтра документа. Во-первых, запишите подкласс NavigationFilter. Затем присоедините экземпляр подкласса к текстовому компоненту с setNavigationFilter метод.

Вы могли бы создать пользовательское каре, чтобы настроить появление каре. Чтобы создать пользовательское каре, запишите class, который реализует Caret интерфейс — возможно, расширяясь DefaultCaret class. Затем обеспечьте экземпляр своего class как параметр setCaret метод на текстовом компоненте.

Понятия: О Редакторе Китсе

Текстовые компоненты используют EditorKit связывать различные части текстового компонента вместе. Набор редактора обеспечивает фабрику представления, документ, каре, и действия. Набор редактора также читает и пишет документы определенного формата. Хотя все текстовые компоненты используют наборы редактора, некоторые компоненты скрывают их. Невозможно установить или использовать набор редактора текстовым полем или текстовой областью. Области редактора и текстовые области обеспечивают getEditorKit метод, чтобы получить текущий набор редактора и setEditorKit метод, чтобы изменить это.

Для всех компонентов, JTextComponent class предоставляет API Вам, чтобы косвенно вызвать или настроить некоторые возможности набора редактора. Например, JTextComponent обеспечивает read и write методы, которые вызывают набор редактора read и write методы. JTextComponent также обеспечивает метод, getActions, который возвращает все действия, поддерживаемые компонентом.

Текстовый пакет Swing обеспечивает следующие наборы редактора:

DefaultEditorKit
Простой текст чтений и записей, и обеспечивает основной набор редактирования команд. Детали о том, как текстовая система обрабатывает новые строки, могут быть найдены в DefaultEditorKit Документация API. Кратко, '\n' символ используется внутренне, но документ, или разделители строки платформы используются при записи файлов. Все другие наборы редактора являются потомками DefaultEditorKit class.
StyledEditorKit
Чтения и записи разработанный текст, и обеспечивают минимальный набор действий для стилизованного текста. Этот class является подклассом DefaultEditorKit и набор редактора, используемый JTextPane по умолчанию.
HTMLEditorKit
Чтения, записи, и HTML редактирований. Это - подкласс StyledEditorKit.

Каждый из упомянутых выше наборов редактора был зарегистрирован в JEditorPane class и связанный с текстовым форматом, который читает набор, пишет, и редактирования. Когда файл загружается в область редактора, область проверяет формат файла против его зарегистрированных наборов. Если зарегистрированный набор находится, который поддерживает тот формат файла, область использует набор, чтобы считать файл, дисплей, и отредактировать это. Таким образом область редактора эффективно преобразовывает себя в редактора для того текстового формата. Можно расшириться JEditorPane поддерживать Ваш собственный текстовый формат, создавая набор редактора для этого, и затем использование JEditorPane's registerEditorKitForContentType связать Ваш набор с Вашим текстовым форматом.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя текстовые Компоненты
Следующая страница: текстовый Компонентный API