|
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 показывает перетащить курсор.
Затем, мы показываем демонстрационный пример дерева, которое реализовало чувствительное к расположению отбрасывание.