Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Передача данных Swing

Для JavaTM 2 Платформы, Standard Edition, v 1.4 выпуска, Swing добавил поддержку передачи данных между приложениями. Работа перетаскивания и отбрасывания является запросом передачи данных, который был определен жестом с графическим указывающим устройством. В случае копии/вставки передача данных часто инициируется с клавиатурой. Возможность передать данные принимает две формы:

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

Поскольку состояние каждого компонента Swing независимо от определения модели данных, было легко реализовать механизм для того, чтобы переместить данные между компонентами, не волнуясь о деталях данных непосредственно. Передача данных составляет передачу части одной модели к другой модели. (В случае сокращения/копии/вставки данные передаются между моделью и буфером обмена.), Чтобы поддерживать передачу данных, нас:

Справочник: Компоненты Та Поддержка DnD

Компонент Поддерживает Перетаскивают Поддерживает Отбрасывание
JColorChooser X X
JEditorPane X X
JFileChooser X X
JFormattedTextField X X
JLabel см. здесь см. здесь
JList X X
JPasswordField X X
JTable X X
JTextArea X X
JTextField X X
JTextPane X X
JTree X X

У этого документа есть следующие разделы:

Поддержка Передачи данных

Основа передачи данных является поддержкой обработки передачи данных в и из компонента. С этой функциональностью, доступной на компоненте, механика управления перетаскиванием и отбрасыванием может быть обеспечена автоматически. Кроме того, поддержка сокращения/копии/вставки может также быть оказана автоматически. Затруднение этой реализации является новым классом TransferHandler. JComponent методы свойства, setTransferHandler и getTransferHandler, обеспечьте entrypoint для механизма передачи данных для любого компонента, который расширяется JComponent.

Таблица ниже детализирует степень сокращения, копии, вставки, и поддержки отбрасывания каждого из компонентов когда не -null TransferHandler устанавливается. Отметьте, что эта поддержка включается кодом стили. Поддержка перетаскивания первоначально отключается, но может быть включена, вызывая setDragEnabled(true) на компоненте. Если у компонента нет такого метода, перетаскивание может быть включено, связывая некоторый жест с этим.

Поддержка TransferHandler по умолчанию

Для упомянутых ниже компонентов Swing устанавливает реализации по умолчанию TransferHandler. Для тех компонентов, у которых есть поддержка Swing по умолчанию, TransferHandler устанавливается ComponentUI если значение transferHandler свойство null или отмеченный присутствием UIResource интерфейс. Значение по умолчанию TransferHandler реализация, установленная ComponentUI отмечается UIResource интерфейс, позволяя разработчикам переопределить значение по умолчанию TransferHandler. Следующая таблица показывает оказанную поддержку.

Компоненты Та Поддержка DnD

Компонент Экспорт (Перетаскивают, Сокращение, Копия), Импорт (Отбрасывание, Вставка)
JColorChooser Выбранный цвет предлагается посредством обработки свойства JavaBeansTM TransferHandler. Предлагаемая разновидность application/x-java-jvm-local-objectref; class=java.awt.Color. Переданное значение определяется getColor. Принимает вставляет типа Color. Данные импортируются при использовании setColor (от бобовой обработки свойства). Любое наличие разновидности class=java.awt.Color (или подкласс java.awt.Color) принимается.
JEditorPane 1.4: Если content-type из JEditorPane text/plain, выбранный текст предлагается как text/plain через write метод EditorKit. Если content-type OTHER, это экспортируется оба как text/plain использование getSelectedText метод, и как OTHER использование write метод EditorKit.

1.4.1: Выбранный текст, как возвращено getSelectedText метод, экспортируется как text/plain. Кроме того, если content-type из JEditorPane кроме text/plain, выбранный контент также предлагается в той другой разновидности, используя EditorKit's write метод.

1.4: Принимает вставляет типа text/plain и безотносительно текущего типа, возвращенного getContentType. Если тип находится, соответствуя текущий тип (включая text/plain), это импортируется, используя EditorKit's read метод. Иначе, text/plain импортируется через компонент replaceSelection метод. Вставка: содержание выбора, если таковые вообще имеются, заменяется. Отбрасывание: данные вставляются в позиции каре.

1.4.1: Принимает вставляет типа text/plain и безотносительно текущего типа, возвращенного getContentType. Если тип находится, соответствуя текущий тип (исключая text/plain), это импортируется, используя EditorKit's read метод. Иначе, text/plain импортируется через компонент replaceSelection метод. Вставка: содержание выбора, если таковые вообще имеются, заменяется. Отбрасывание: данные вставляются в позиции каре.

JFileChooser Выбор предлагается тем же самым способом как те от собственного селектора файла. Импорт, не принятый. Поскольку мышь отодвигается список, потенциал упал на пункт, обозначается, выделяя файл/каталог под курсором. См. Поддержку Отбрасывания По умолчанию.
JFormattedTextField Выбранный текст предлагается как text/plain. Принимает вставляет типа text/plain. Вставка: содержание выбора, если таковые вообще имеются, заменяется; иначе данные вставляются в позиции каре. Отбрасывание: данные вставляются в позиции каре. Отметьте, что вставка и отбрасывание используют те же самые пути выполнения кода как вводящий от клавиатуры, поэтому кодируют проверку допустимости, сохраняется.
JList Если выбор является единственным элементом, он предлагается как text/plain. Если многократные элементы выбираются, им предлагают как text/html. Формат text/html a <UL> тег, сопровождаемый выбранными элементами списка каждый запуск с <LI> тег. Импорт, не принятый. Поскольку мышь отодвигается список, потенциал упал на пункт, обозначается, выделяя элемент списка под курсором. См. Поддержку Отбрасывания По умолчанию.
JPasswordField Для соображений безопасности, сокращения, копии, и перетаскивают, не поддерживаются. Принимает вставляет типа text/plain. Вставка: содержание выбора, если таковые вообще имеются, заменяется; иначе данные вставляются в позиции каре. Отбрасывание: данные вставляются в позиции каре.
JTable Если выбор является единственным элементом, он предлагается как text/plain. Если многократные элементы выбираются, им предлагают как text/html. Формат text/html a <TABLE> тег следовал a <TR> тег для каждой строки и a <TD> тег для каждой ячейки. Импорт, не принятый. Поскольку мышь отодвигается таблица, потенциал упал на пункт, обозначается, выделяя ячейку под курсором. См. Поддержку Отбрасывания По умолчанию.
JTextArea Выбранный текст предлагается как text/plain. Принимает вставляет типа text/plain. Вставка: содержание выбора, если таковые вообще имеются, заменяется; иначе данные вставляются в позиции каре. Отбрасывание: данные вставляются в позиции каре.
JTextField Выбранный текст предлагается как text/plain. Принимает вставляет типа text/plain. Вставка: содержание выбора, если таковые вообще имеются, заменяется; иначе данные вставляются в позиции каре. Отбрасывание: данные вставляются в позиции каре.
JTextPane То же самое как JEditorPane. То же самое как JEditorPane.
JTree Если выбор является единственным элементом, он предлагается как text/plain. Если многократные элементы выбираются, им предлагают как text/html. Формат text/html вкладывается списки, подобные формату, используемому для JList. Импорт, не принятый. Поскольку мышь отодвигается таблица, потенциал упал на пункт, обозначается, выделяя древовидный узел под курсором. См. Поддержку Отбрасывания По умолчанию.

Пример Добавляющей Поддержки JLabel

JLabel компонент не поддерживает DnD по умолчанию. Следующий фрагмент кода создает a JLabel это поддерживает, перетаскивают и отбрасывают на "текстовом" свойстве (a String):

JLabel componentType = new JLabel();
componentType.setTransferHandler(new TransferHandler("text"));
MouseListener ml = new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        JComponent c = (JComponent)e.getSource();
        TransferHandler th = c.getTransferHandler();
        th.exportAsDrag(c, e, TransferHandler.COPY);
    }
};
componentType.addMouseListener(ml);

Мы включали маленький пример, который реализации перетаскивают и отбрасывают использование a JTextField и a JLabel. Можно ввести значение в текстовое поле, выделить текст, затем удержать кнопку мыши вниз по текстовому полю и перетащить несколько пикселей. Значок появляется под курсором. Выпустите значок по JLabel и см., что текст заменяет "Отбрасывание Здесь" текст. Одновременно с отбрасыванием, текст удаляется из исходного текстового поля. Поведение по умолчанию для перетаскивает, и отбрасывание MOVE. Изменить поведение на COPY, удержите CONTROL манипулируйте, выбирая текст. На Windows знак "плюс" появляется в значке. Когда текст выпускается на цели, это оставляют неповрежденным в источнике. Можно аналогично перетащить от JLabel к текстовому полю. Отметьте это JLabel не имеет привязки для копии/вставки и неспособен получить фокус, который обязан поддерживать эту функцию.

См. пример JLabelDragNDrop.java здесь.

Перетащите Поддержку

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

С этим уровнем перетаскивают поддержку, разработчик Swing может сосредоточиться на том, чтобы реализовывать a TransferHandler это представляет требуемую передачу, и свойства установки на компоненте Swing. Это значительно упрощает бремя для разработчика Swing, желающего поддерживать притягивающий приложение.

Отметьте, что мы в настоящий момент исследуем обеспечение различных визуальных появлений перетаскивания, следовательно ссылка на Icon в API. Останьтесь настроенными для будущих разработок.

Значение по умолчанию Перетаскивает Поддержку

Самый простой уровень поддержки должен установить флаг, который указывает, что разработчик хотел бы включенную поддержку по умолчанию. Компоненты, которые предлагают поддержку по умолчанию перетаскивания, описываются в столбце Exports Компонентов Та Поддержка таблица DnD; но подводить итог, классы это непосредственно реализует setDragEnabled и getDragEnabled : JColorChooser, JFileChooser, JList, JTable, JTree, и JTextComponent. Перетащить жест определяется как нажатие первой кнопки мыши по выбору и перетаскивающий несколько пикселей. Установка dragEnabled свойство к true поэтому имеет тонкий эффект на поведение мыши.

Когда перетаскивание включается на компоненте, контроллер Swing (в соответствии ComponentUI подкласс), начинает искать перетащить жест, и если transferHandler свойство null, или отмеченный присутствием UIResource интерфейс, реализация по умолчанию устанавливается. Реализация, обеспеченная Swing, отмечается с UIResource интерфейс, таким образом, разработчик может вставить новое TransferHandler заменяя значение по умолчанию TransferHandler свойство с пользовательской реализацией. Когда перетащить жест распознается, exportAsDrag к методу обращаются TransferHandler который инициирует перетащить механизм. Фактическая передача обрабатывается java.awt.dnd механизм, не требуя никакого дальнейшего усилия от разработчика.

Добавление Перетаскивает Поддержку Подклассам Классов Swing

Перетащить поддержка, оказанная Swing, активируется TransferHandler.exportAsDrag метод. Это заставляет добавление перетащить поддержку столь же легкую как:

  1. Установка a TransferHandler реализация (таким образом, есть что-то, чтобы перетащить), вызывая setTransferHandler метод.
  2. Распознавание перетащить жест.
  3. Вызов exportAsDrag метод.

Некоторые сценарии для того, чтобы выполнить это:

Работа TransferHandler.exportAsDrag

Когда exportAsDrag к методу обращаются TransferHandler, перетаскивание обрабатывается Swing, обеспеченным функциональность. То, когда этот метод вызывают, предполагается, что допустимое перетаскивает жест, было распознано. Метод выполняет следующие шаги:

  1. Реализация Swing a DragSource и DragListener используется, чтобы запустить перетащить использование Transferable реализация, возвращенная createTransferable как объект передачи данных.
  2. Когда отбрасывание завершилось, exportDone к методу обращаются TransferHandler. Для некоторых операций, такой как MOVE, может быть необходимо удалить данные из источника. Поведение по умолчанию для основанных на тексте компонентов, например, состоит в том, что стандарт перетаскивает реализации MOVE поведение (после отбрасывания выбранный текст удаляется из исходного компонента). Пользователь может переопределить это поведение удержанием клавиши CTRL, когда текст выбирается для того, чтобы перетащить. На Windows перетащить значок визуально отражает это поведение с маленьким знаком "плюс".

Поддержка отбрасывания

Основная поддержка обработки отбрасывания является тем же самым что касается операции вставки, importData метод на TransferHandler. Семантика вставки данных в компонент обычно более значима на уровне приложения чем уровень инструментария. Пользователи приложения могут отбросить все виды Transferable реализации на компонентах, которые абсолютно неизвестны инструментарию Swing. Это до разработчика Swing, чтобы обеспечить a TransferHandler со значимой семантикой импорта, если значение по умолчанию TransferHandler недостаточно.

У работы отбрасывания действительно есть некоторые различия от вставки однако:

Поддержка Отбрасывания по умолчанию

Чтобы помочь разработчикам Swing в добавляющей поддержке отбрасывания приложению, Swing обеспечивает DropTarget реализации, которые используют TransferHandler свойство на компоненте Swing. Для тех компонентов, которые имеют не -null TransferHandler свойство, цель отбрасывания устанавливается ComponentUI если значение dropTarget свойство null или отмеченный присутствием UIResource интерфейс. Значение по умолчанию DropTarget реализации, установленные ComponentUI отмечается UIResource интерфейс, позволяя разработчикам переопределить значение по умолчанию DropTarget.

Компоненты, которые обеспечивают полную реализацию отбрасывания по умолчанию, обозначаются в столбце Imports Компонентов Та Поддержка таблица DnD. Есть четыре компонента, которые оказывают только некоторую поддержку для отбрасывания. JFileChooser, JList, JTable, и JTree по умолчанию имейте установленный DropTarget это указывает на потенциальную точку вставки. Однако, чтобы полностью поддерживать импорт данных разработчик должен записать и установить пользовательское TransferHandler.

Используя Поддержку Отбрасывания в Подклассах Классов Swing

Реализация DropTarget хорошего поведения использует transferHandler свойство на JComponent выполнять отбрасывание. Разработчик Swing автоматически получает простое DropTarget реализация, которая соединяет спад TransferHandler когда transferHandler свойство устанавливается и dropTarget свойство null.

Поддержка Передачи буфера обмена

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

Передача Буфера обмена по умолчанию

Как с перетаскивают и отбрасывают, передачи буфера обмена являются самыми полезными для тех компонентов та поддержка выборы. Список компонентов, показанных в столбце Exports Компонентов, Которые сократила Поддержка таблица DnD, скопируйте, и вставьте действия в компонентной карте действия, наряду с зависимым набором LAF привязки клавиатуры во входной карте компонента. Наличие Swing обеспечивает, эта привязка освобождает разработчика от попытки отследить текущий стиль и изменить привязку.

Используя Поддержку Передачи Буфера обмена в Подклассах Классов Swing

Сокращение хорошего поведения, копия, и реализация вставки используют transferHandler свойство на JComponent выполнять передачу. Когда transferHandler свойство устанавливается на a JComponent, простое Action реализация, которая соединяет передачу между a Clipboard и TransferHandler устанавливается в карте действия компонента под ключами cut, copy, и paste если нет никакого действия, в настоящий момент установленного.

Детали реализации

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

Если a TransferHandler устанавливается на a JComponent, стиль тогда включает сокращению, копии, и вставке, используя следующий TransferHandler методы:

Если Вы связываете некоторое событие с TransferHandler.exportAsDrag Вы также добираетесь, перетаскивают поддержку. Эта инфраструктура располагается в частных на пакет вложенных классах в TransferHandler класс.

Следующие частные на пакет классы были добавлены к javax.swing.plaf.basic пакет для того, чтобы создать поддержку по умолчанию:

BasicTransferable
Основание различного Transferable реализации.
BasicDropTargetListener
Добавляет прокрутка поддержки и целевой обратной связи отбрасывания для тех компонентов, поддерживающих выбор.
BasicDragGestureRecognizer
Поддерживает "выбор, и переместитесь, несколько пикселей" перетаскивают распознавание жеста.

Каждый из ComponentUI у классов, которые поддерживают DnD тогда, есть некоторые дополнительные вложенные классы:

BasicTreeUI:

TreeTransferHandler
Поддержка импорта/экспорта по умолчанию.
TreeTransferable
Фактические древовидные данные.
TreeDragGestureRecognizer
Дерево перетаскивает распознавание жеста, включенное JTree.setDragEnabled.
TreeDropHandler
Шоу отбрасывают целевое расположение.

BasicListUI, BasicTableUI, BasicTextUI у всех есть образец, подобный как BasicTreeUI.

BasicFileChooserUI
Использует поддержку списка, но имеет a FileTransferHandler это производит FileTransferable это расширяется ListTransferable с разновидностью, используемой для передач файлов.
BasicColorChooserUI
Использование TransferHandler бобовая поддержка и связывает "цветное" свойство. Слушатель мыши добавляется к области предварительного просмотра, чтобы связать щелчок мышью с exportAsDrag метод на TransferHandler.

Изменения Начиная с Беты

Действия TransferHandler Должны быть Зарегистрированы UI

Отчет bugtraq, который соответствует этому изменению: 4460011.

Чтобы реализовать перетаскивают и отбрасывают, привязка была обеспечена в Action класс, чтобы поддерживать копирование и вставку данных. Для стили, или другого кода, чтобы переопределить их Actions, UI должен установить их - Actions автоматически больше не устанавливаются TransferHandler. Закрытые методы пакета getCutAction, getCopyAction, и getPasteAction в TransferHandler теперь обнародованы.

Возможность Отключить DropTarget

Отчет bugtraq, который соответствует этому изменению: 4485914.

Реализация перетаскивания и отбрасывания вызывает a DropTarget быть добавленным к a JComponent если у того компонента есть a TransferHandler установленный. Это может влиять на приложения, которые вручную добавляют DropTargets. Поэтому свойство System suppressSwingDropSupport был добавлен. JComponent методы setTransferHandler(TransferHandler) и getTransferHandler может использоваться, чтобы включить или отключить это свойство.

Известные Ошибки

Отбрасывание Ударяет Выбранный текст в JTextComponent

Отчет bugtraq, который соответствует этой проблеме: 4513715.

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

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

Отчет bugtraq, который соответствует этой проблеме: 4513720.

Со встроенной поддержкой отбрасывания текстовые компоненты Swing отвечают на DnD dragovers, устанавливая Caret к видимому и использующему это, чтобы вывести на экран потенциальное расположение вставки. Когда перетащить выходы компонент, Caret's видимость восстанавливается. К сожалению, начиная с Caret использует то же самое"visible"свойство, чтобы представить обычное значение видимых так же как когда это находится в середине флэш-памяти, мы иногда, восстанавливает видимость Каре неправильно.

Сократите/Копируйте/Перетащите Поврежденный для JEditorPane с RTFEditorKit

Отчет bugtraq, который соответствует этой проблеме: 4513638.

При использовании RTFEditorKit набор явно на a JEditorPane использование setEditorKit, или устанавливая content-type к text/rtf, сокращение, копия и не перетаскивают больше работу. Отметьте, что эта ошибка, зарегистрированная против выпуска 1.4, исправляется в выпуске 1.4.1.


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами