文档

Java™ 教程
隐藏目录
位置敏感的放置
教程:使用Swing创建GUI
课程:拖放和数据传输

位置敏感拖放

有时您有一个复杂的组件,您希望用户能够在其中的某些部分上放置,但在其他部分上不能放置。也许它是一个表格,只允许在某些列中放置数据;或者它是一个树,只允许在某些节点上放置数据。显然,您希望光标提供准确的反馈 - 只有当它在接受拖放的组件的特定部分上时,它才应显示拖放位置。

通过在TransferHandler类的canImport(TransferHandler.TransferSupport)方法中安装必要的逻辑,可以简单地实现这一点。它只能与此特定版本的canImport一起工作,因为它在拖动手势在组件边界上时被连续调用。当此方法返回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显示拖动光标。

接下来,我们展示一个实现了位置敏感拖放的树的演示。


上一页: 显示拖放位置
下一页: 示例 - LocationSensitiveDemo