文档

Java™ 教程
隐藏目录
演示 - LocationSensitiveDemo
教程路径:使用Swing创建GUI
课程:拖放和数据传输
章节:位置敏感的拖放

演示 - 位置敏感的示例

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

树下面的一个组合框允许您切换显示放置位置的行为。Swing的默认行为是仅在区域可以接受拖放时显示放置位置。您可以覆盖此行为以始终显示放置位置(即使区域无法接受拖放),或者从不显示放置位置(即使区域可以接受拖放)。

LocationSensitiveDemo演示的快照。

试一试: 
  1. 点击“Launch”按钮以使用Java™ Web Start运行LocationSensitiveDemo下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参阅示例索引启动ListDemo示例
  2. 在文本字段中按下“String 0”并将鼠标移动一小段距离以启动拖动。将其拖到树中并向下移动。当您将鼠标悬停在大多数节点上时,拖放接受性将通过鼠标指针和节点的高亮来指示。将文本放在“colors”节点上。新项目将成为该节点的子项目,与所列颜色成为兄弟项目。
  3. 将文本字段中的“String 1”拖动到树中。试图将其放在“names”节点上。当您拖动到该节点或其子节点上时,Swing将不会提供任何放置位置反馈并且不会接受数据。
  4. 将“Show drop location”组合框更改为“Always”。
  5. 重复步骤1和2。现在,“names”节点显示了放置位置,但您无法将数据放入该区域。
  6. 将“Show drop location”组合框更改为“Never”。
  7. 重复步骤1和2。树的任何部分都不会显示放置位置,但您仍然可以将数据放入“names”以外的节点中。

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("始终")) {
        info.setShowDropLocation(true);
    } else if (item.equals("从不")) {
        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,导入将不被接受。


上一页:位置敏感删除
下一页:空表删除