Spec-Zone .ru
спецификации, руководства, описания, API
|
JTextComponent
class является основой для текстовых компонентов Swing. Этот class обеспечивает следующие настраиваемые функции всех его потомков:
См. вызванный пример TextComponentDemo
исследовать эти возможности. Хотя TextComponentDemo
пример содержит специализированный экземпляр JTextPane
, возможности, обсужденные в этом разделе, наследованы всеми JTextComponent
подклассы.
Верхний текстовый компонент является специализированной текстовой областью. Более низкий текстовый компонент является экземпляром JTextArea
, который служит журналом, который сообщает обо всех изменениях, произведенных в содержании текстовой области. Строка состояния у основания окна сообщает или о расположении выбора или о позиции каре, в зависимости от того, выбирается ли текст.
Используя TextComponentDemo
пример как контрольная точка, этот раздел затрагивает следующие темы:
Все текстовые компоненты Swing поддерживают стандартные команды редактирования такой как сокращено, копируют, вставляют, и вставляют символы. Каждая команда редактирования представляется и реализуется Action
объект. (Чтобы узнать больше о действиях видят
Можно вызвать 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
у основания окна. У этой характеристики совместного использования есть два важных разветвления:
Action
объекты Вы добираетесь от наборов редактора. Если Вы делаете, изменения влияют на все текстовые компоненты в Вашей программе.Action
объекты могут работать на других текстовых компонентах в программе, иногда больше, чем Вы предназначали. В этом примере, даже при том, что это не доступно для редактирования, JTextArea
действия долей с JTextPane
. (Выберите некоторый текст в текстовой области, затем выберите пункт меню сокращения к буферу обмена. Вы услышите звуковой сигнал, потому что текстовая область не доступна для редактирования.), Если Вы не хотите совместно использовать, инстанцируйте Action
возразите себе. DefaultEditorKit
определяет много полезные Action
подклассы.Вот код, который создает меню 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
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
Element
объекты, которые могут представить любую логическую текстовую структуру, такую как абзацы, или текстовые выполнения та доля стили. Мы не описываем Element
объекты здесь.remove
и insertString
методы.Position
объекты, которые отслеживают определенное расположение в пределах текста, как раз когда текст изменяется.Текстовый пакет Swing содержит подынтерфейс Document
, StyledDocument
JTextComponent
подкласс, JTextPane
, требует, чтобы его документ был a StyledDocument
вместо просто a Document
.
javax.swing.text
пакет обеспечивает следующую иерархию классов документа, которые реализуют специализированные документы для различного JTextComponent
подклассы:
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
setCaret
метод на текстовом компоненте.
Текстовые компоненты используют EditorKit
связывать различные части текстового компонента вместе. Набор редактора обеспечивает фабрику представления, документ, каре, и действия. Набор редактора также читает и пишет документы определенного формата. Хотя все текстовые компоненты используют наборы редактора, некоторые компоненты скрывают их. Невозможно установить или использовать набор редактора текстовым полем или текстовой областью. Области редактора и текстовые области обеспечивают getEditorKit
метод, чтобы получить текущий набор редактора и setEditorKit
метод, чтобы изменить это.
Для всех компонентов, JTextComponent
class предоставляет API Вам, чтобы косвенно вызвать или настроить некоторые возможности набора редактора. Например, JTextComponent
обеспечивает read
и write
методы, которые вызывают набор редактора read
и write
методы. JTextComponent
также обеспечивает метод, getActions
, который возвращает все действия, поддерживаемые компонентом.
Текстовый пакет Swing обеспечивает следующие наборы редактора:
DefaultEditorKit
DefaultEditorKit
Документация API. Кратко, '\n' символ используется внутренне, но документ, или разделители строки платформы используются при записи файлов. Все другие наборы редактора являются потомками DefaultEditorKit
class.StyledEditorKit
DefaultEditorKit
и набор редактора, используемый JTextPane
по умолчанию.HTMLEditorKit
StyledEditorKit
.Каждый из упомянутых выше наборов редактора был зарегистрирован в JEditorPane
class и связанный с текстовым форматом, который читает набор, пишет, и редактирования. Когда файл загружается в область редактора, область проверяет формат файла против его зарегистрированных наборов. Если зарегистрированный набор находится, который поддерживает тот формат файла, область использует набор, чтобы считать файл, дисплей, и отредактировать это. Таким образом область редактора эффективно преобразовывает себя в редактора для того текстового формата. Можно расшириться JEditorPane
поддерживать Ваш собственный текстовый формат, создавая набор редактора для этого, и затем использование JEditorPane
's registerEditorKitForContentType
связать Ваш набор с Вашим текстовым форматом.