Spec-Zone .ru
спецификации, руководства, описания, API
|
Иногда у Вас есть сложный компонент, и Вы хотите, чтобы пользователь был в состоянии отбросить на некоторых частях его, но не на других. Возможно, это - таблица, которая позволяет данным быть отброшенными только в определенных столбцах; или возможно это - дерево, которое позволяет данным быть отброшенными только на определенных узлах. Очевидно, Вы хотите, чтобы курсор обеспечил точную обратную связь — это должно только показать расположение отбрасывания, когда это по определенной части компонента, который принимает отбрасывания.
Это просто выполнить, устанавливая необходимую логику в canImport(TransferHandler.TransferSupport
) метод TransferHandler
class. Это работает только с этой определенной версией canImport
потому что это вызывают continously, в то время как перетащить жест по границам компонента. Когда этот метод возвращает true, Swing показывает курсор отбрасывания, и расположение отбрасывания визуально обозначается; когда этот метод возвращает false, Swing показывает "нет - перетаскивают" курсор, и расположение отбрасывания не выводится на экран.
Например, вообразите таблицу, которая позволяет отбрасывание, но не в первом столбце. canImport
метод мог бы выглядеть примерно так:
public boolean canImport(TransferHandler.TransferSupport info) { // for the demo, we will only support drops (not clipboard paste) if (!info.isDrop()) { return false; } // we only import Strings if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) { return false; } // fetch the drop location JTable.DropLocation dl = (JTable.DropLocation)info.getDropLocation(); int column = dl.getColumn(); // we do not support invalid columns or the first column if (column == -1 || column == 0) { return false; } return true; }
Код, выведенный на экран полужирным, указывает на чувствительную к расположению логику отбрасывания: Когда пользователь отбрасывает данные таким способом, которым столбец не может быть вычислен (и поэтому недопустимо), или когда пользователь отбрасывает текст в первом столбце, canImport
метод возвращает false — таким образом, Swing показывает "нет - перетаскивают" курсор мыши. Как только пользователь перемещает мышь от первого столбца canImport
возвращает true, и Swing показывает перетащить курсор.
Затем, мы показываем демонстрационный пример дерева, которое реализовало чувствительное к расположению отбрасывание.