Spec-Zone .ru
спецификации, руководства, описания, API
|
Для JavaTM 2 Платформы, Standard Edition, v 1.4 выпуска, Swing добавил поддержку передачи данных между приложениями. Работа перетаскивания и отбрасывания является запросом передачи данных, который был определен жестом с графическим указывающим устройством. В случае копии/вставки передача данных часто инициируется с клавиатурой. Возможность передать данные принимает две формы:
Поскольку состояние каждого компонента Swing независимо от определения модели данных, было легко реализовать механизм для того, чтобы переместить данные между компонентами, не волнуясь о деталях данных непосредственно. Передача данных составляет передачу части одной модели к другой модели. (В случае сокращения/копии/вставки данные передаются между моделью и буфером обмена.), Чтобы поддерживать передачу данных, нас:
Компонент | Поддерживает Перетаскивают | Поддерживает Отбрасывание |
---|---|---|
JColorChooser |
||
JEditorPane |
||
JFileChooser |
||
JFormattedTextField |
||
JLabel |
см. здесь | см. здесь |
JList |
||
JPasswordField |
||
JTable |
||
JTextArea |
||
JTextField |
||
JTextPane |
||
JTree |
У этого документа есть следующие разделы:
Основа передачи данных является поддержкой обработки передачи данных в и из компонента. С этой функциональностью, доступной на компоненте, механика управления перетаскиванием и отбрасыванием может быть обеспечена автоматически. Кроме того, поддержка сокращения/копии/вставки может также быть оказана автоматически. Затруднение этой реализации является новым классом TransferHandler
. JComponent
методы свойства,
setTransferHandler
и getTransferHandler
, обеспечьте entrypoint для механизма передачи данных для любого компонента, который расширяется JComponent
.
Таблица ниже детализирует степень сокращения, копии, вставки, и поддержки отбрасывания каждого из компонентов когда не -null
TransferHandler
устанавливается. Отметьте, что эта поддержка включается кодом стили. Поддержка перетаскивания первоначально отключается, но может быть включена, вызывая setDragEnabled(true)
на компоненте. Если у компонента нет такого метода, перетаскивание может быть включено, связывая некоторый жест с этим.
TransferHandler
. Для тех компонентов, у которых есть поддержка Swing по умолчанию, TransferHandler
устанавливается ComponentUI
если значение transferHandler
свойство null
или отмеченный присутствием UIResource
интерфейс. Значение по умолчанию TransferHandler
реализация, установленная ComponentUI
отмечается UIResource
интерфейс, позволяя разработчикам переопределить значение по умолчанию TransferHandler
. Следующая таблица показывает оказанную поддержку. Компонент | Экспорт (Перетаскивают, Сокращение, Копия), | Импорт (Отбрасывание, Вставка) |
---|---|---|
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: Выбранный текст, как возвращено |
1.4: Принимает вставляет типа text/plain и безотносительно текущего типа, возвращенного getContentType . Если тип находится, соответствуя текущий тип (включая
text/plain ), это импортируется, используя EditorKit 's read метод. Иначе, text/plain импортируется через компонент replaceSelection метод. Вставка: содержание выбора, если таковые вообще имеются, заменяется. Отбрасывание: данные вставляются в позиции каре. 1.4.1: Принимает вставляет типа |
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, активируется TransferHandler.exportAsDrag
метод. Это заставляет добавление перетащить поддержку столь же легкую как:
TransferHandler
реализация (таким образом, есть что-то, чтобы перетащить), вызывая setTransferHandler
метод.exportAsDrag
метод.Некоторые сценарии для того, чтобы выполнить это:
MouseListener
это наблюдает за требуемым жестом, затем вызовите getTransferHandler
на компоненте и вызове exportAsDrag
метод, когда требуемый жест находится. См. пример JLabel.processMouseEvent
метод в подклассе и вызове exportAsDrag
метод на переменной ComponentUI, когда перетащить жест замечается, иначе выполните поведение суперкласса.exportAsDrag
когда перетащить жест был замечен.Когда exportAsDrag
к методу обращаются TransferHandler
, перетаскивание обрабатывается Swing, обеспеченным функциональность. То, когда этот метод вызывают, предполагается, что допустимое перетаскивает жест, было распознано. Метод выполняет следующие шаги:
DragSource
и DragListener
используется, чтобы запустить перетащить использование Transferable
реализация, возвращенная createTransferable
как объект передачи данных.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
.
Реализация DropTarget хорошего поведения использует transferHandler
свойство на JComponent
выполнять отбрасывание. Разработчик Swing автоматически получает простое DropTarget
реализация, которая соединяет спад TransferHandler
когда transferHandler
свойство устанавливается и dropTarget
свойство null
.
Сокращение, копия, и операции вставки выполняют передачу данных способом, который более полезен для тех без мыши, поскольку они обычно инициируются через жест клавиатуры. Эти операции могут использовать то же самое TransferHandler
службы как поддержка перетаскивания и отбрасывания. Это улучшает доступность передач данных, и позволяет Swing обеспечить привязку клавиатуры для этих операций даже при том, что Swing, возможно, не знает, как фактически передать данные буферу обмена. Привязка клавиатуры для передачи буфера обмена зависит от текущего стили, который устанавливается.
Как с перетаскивают и отбрасывают, передачи буфера обмена являются самыми полезными для тех компонентов та поддержка выборы. Список компонентов, показанных в столбце Exports Компонентов, Которые сократила Поддержка таблица DnD, скопируйте, и вставьте действия в компонентной карте действия, наряду с зависимым набором LAF привязки клавиатуры во входной карте компонента. Наличие 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
FileTransferHandler
это производит FileTransferable
это расширяется ListTransferable
с разновидностью, используемой для передач файлов.BasicColorChooserUI
TransferHandler
бобовая поддержка и связывает "цветное" свойство. Слушатель мыши добавляется к области предварительного просмотра, чтобы связать щелчок мышью с exportAsDrag
метод на TransferHandler
.Отчет bugtraq, который соответствует этому изменению:
Чтобы реализовать перетаскивают и отбрасывают, привязка была обеспечена в Action
класс, чтобы поддерживать копирование и вставку данных. Для стили, или другого кода, чтобы переопределить их Action
s, UI должен установить их - Action
s автоматически больше не устанавливаются TransferHandler
. Закрытые методы пакета getCutAction
, getCopyAction
, и
getPasteAction
в TransferHandler
теперь обнародованы.
Отчет bugtraq, который соответствует этому изменению:
Реализация перетаскивания и отбрасывания вызывает a DropTarget
быть добавленным к a JComponent
если у того компонента есть a TransferHandler
установленный. Это может влиять на приложения, которые вручную добавляют DropTarget
s. Поэтому свойство System suppressSwingDropSupport
был добавлен. JComponent
методы
setTransferHandler(TransferHandler)
и getTransferHandler
может использоваться, чтобы включить или отключить это свойство.
Отчет bugtraq, который соответствует этой проблеме:
Выбор текста и затем перетаскивания, на которое текст в пределах выбранной области того же самого текстового компонента заставляет выбранный текст быть ударенным и ничто, чтобы быть вставленным. Эта ошибка исправляется в выпуске 1.4.1.
Отчет bugtraq, который соответствует этой проблеме:
Со встроенной поддержкой отбрасывания текстовые компоненты Swing отвечают на DnD dragovers, устанавливая Caret
к видимому и использующему это, чтобы вывести на экран потенциальное расположение вставки. Когда перетащить выходы компонент, Caret
's видимость восстанавливается. К сожалению, начиная с Caret
использует то же самое"visible
"свойство, чтобы представить обычное значение видимых так же как когда это находится в середине флэш-памяти, мы иногда, восстанавливает видимость Каре неправильно.
Отчет bugtraq, который соответствует этой проблеме:
При использовании RTFEditorKit
набор явно на a JEditorPane
использование setEditorKit
, или устанавливая content-type
к text/rtf
, сокращение, копия и не перетаскивают больше работу. Отметьте, что эта ошибка, зарегистрированная против выпуска 1.4, исправляется в выпуске 1.4.1.