位置敏感下降

有时您有一个复杂的组件,并且希望用户能够使用它的某些部分,而不能使用其他部分。也许它是一个表,只允许在某些列中删除数据。或者它是一棵只允许在某些节点上删除数据的树。显然,您希望光标提供准确的反馈-仅当光标位于接受墨滴的组件的特定部分上方时,才应显示墨滴位置。

通过在TransferHandler类的canImport(TransferHandler.TransferSupport)方法中安装必要的逻辑即可轻松实现。它仅适用于canImport的特定版本,因为在拖动手势超出组件的边界时会连续调用它。当此方法返回 true 时,Swing 将显示放置光标,并以可视方式指示放置位置;当此方法返回 false 时,Swing 将显示“ no-drag”光标,并且不显示放置位置。

例如,假设有一个允许删除的表,但不允许在第一列中使用。 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 显示拖动光标。

接下来,我们演示了已实现位置敏感放置的树的演示。