【问题标题】:Is there a way to detect if a drop is about to take place on a JTree?有没有办法检测 JTree 上是否即将发生丢弃?
【发布时间】:2011-08-31 18:36:24
【问题描述】:

我有一个 JTree,用户可以在其中从其他组件中删除元素。当用户将鼠标悬停在树中的节点上时(在“放置模式”期间),最靠近的节点被突出显示。这是在TransferHandler的实现中实现的。

@Override
public boolean canImport(TransferSupport support) {

    //Highlight the most near lying node in the tree as the user drags the 
    //mouse over nodes in the tree.
    support.setShowDropLocation(true);

每次选择一个新节点时(也在“放置模式”期间),这将触发一个 TreeSelectionEvent。这反过来将调用我创建的侦听器,该侦听器将查询数据库以获取与该节点相关的详细信息。

现在,我正在寻找一种方法来过滤掉在“放置模式”期间从节点选择中生成的事件。这是一种限制数据库调用的尝试。有人对我如何实现这一点有任何想法吗?

我们将不胜感激!

【问题讨论】:

    标签: java swing drag-and-drop jtree


    【解决方案1】:

    有一种非常间接的方法可以检测到这种情况。您可以使用树组件在属性"dropLocation" 上注册PropertyChangeListener。每当放置位置发生变化时都会调用它,因此您可以在那里设置一个字段dropOn,然后您可以在TreeSelectionListener 中读取该字段。

    tree.addPropertyChangeListener("dropLocation", new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent pce) {
            dropOn = pce.getNewValue() != null;
        }
    });
    
    tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
        public void valueChanged(TreeSelectionEvent tse) {
            System.out.println(tse + " dropOn=" + dropOn);
        }
    });
    

    请注意,这确实会在它第一次进入树时触发错误的 false 值,但随后所有事件都会显示 dropOn = true

    【讨论】:

    • 这个我没试过,但这和做Tree.getDropLocation()一样吗?我已经尝试过那个,但由于某种原因它并没有真正做到这一点......
    • @sbrattla 当然你是对的,这是一个更简单的解决方案。我想的太复杂了......不过,为什么getDropLocation 在你的情况下不起作用?在我看来,它可以满足您的需求。
    • 好吧,我可能需要再看看它,看看我是否能让它正常工作。不能真正把我的手指放在任何事情上(关于它为什么不起作用)......这很可能是一个坐下来花时间去弄清楚的问题。无论如何,感谢您的意见。至少你确认我在正确的轨道上,所以我会将你的答案标记为正确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多