> 演示-LocationSensitiveDemo

下面的演示LocationSensitiveDemo显示了一个JTree,该JTree已配置为支持除称为“名称”(或其后代)的任何节点上的放置。使用框架顶部的文本字段作为拖动源(每次从那里拖动时,它都会自动增加字符串 编号)。

树下方的组合框使您可以切换行为以显示放置位置。 Swing 的默认行为是仅在区域可以接受放置时显示放置位置。您可以覆盖此行为以始终显示放置位置(即使该区域不能接受放置),也可以永远不显示放置位置(即使该区域可以接受放置)。

LocationSensitiveDemo 演示的快照。

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行LocationSensitiveDemo。另外,要自己编译和运行示例,请查阅example index

  • 通过在文本字段中按“字符串0”顶部并将鼠标移动一小段距离来启动拖动。拖入树中并向下移动。当您将鼠标悬停在大多数节点上时,鼠标光标和突出显示的节点都会指示拖动可接受性。将文本拖放到“颜色”节点上。新项目将成为该节点的子项,并成为所列颜色的同级项。

  • 将“字符串1”从文本字段拖到树中。try将其放在“名称”节点上。当您在该节点或其子节点上拖动时,Swing 将不会提供任何放置位置反馈,也不会接受数据。

  • 将“显示放置位置”组合框更改为“始终”。

  • 重复步骤 1 和 2.现在将显示“名称”节点的放置位置,但是您不能将数据放置到该区域中。

  • 将“显示放置位置”组合框更改为“从不”。

  • 重复步骤 1 和 2.尽管仍然可以将数据(“名称”除外)拖放到节点中,但对于树的任何部分都不会显示放置位置。

LocationSensitiveDemocanImport方法如下所示:

public boolean canImport(TransferHandler.TransferSupport info) {
    // for the demo, we will only support drops (not clipboard paste)
    if (!info.isDrop()) {
        return false;
    }

    String item = (String)indicateCombo.getSelectedItem();
                
    if (item.equals("Always")) {
        info.setShowDropLocation(true);
    } else if (item.equals("Never")) {
        info.setShowDropLocation(false);
    }

    // we only import Strings
    if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        return false;
    }

    // fetch the drop location
    JTree.DropLocation dl = (JTree.DropLocation)info.getDropLocation();

    TreePath path = dl.getPath();

    // we do not support invalid paths or descendants of the names folder
    if (path == null || namesPath.isDescendant(path)) {
        return false;
    }

    return true;
}

以粗体显示的第一个代码段修改了放置位置反馈机制。如果为“始终”,则始终显示放置位置。如果为“从不”,则从不显示放置位置。否则,将应用默认行为。

以粗体显示的第二个代码段包含确定树是否将接受数据的逻辑。如果该路径不是有效路径,或者它不是名称路径(或其后代),则将返回 false,并且将不接受导入。