【问题标题】:Swing delegating drop event to parent containerSwing 将 drop 事件委托给父容器
【发布时间】:2012-01-26 07:41:57
【问题描述】:

我想将JList 的“drop”事件委托给它的父级 (JPanel) 并删除在 JList 上的拖放视觉反馈。

这样做的正确方法是什么?

我正在尝试创建一个 DropTarget 对象并在 JPanel 和 JList 之间共享它,但这似乎有点 hackish --- 我无法弄清楚 DropTarget.getComponent() 应该做什么,并担心它可能会破坏东西.

您能否建议正确的方法(在 Java 6 中)?

编辑: *我为什么要这样做?*

我试图让用户将项目分组(一个 JPanel + 一个 JList = 一个组)-当项目时,列表顺序将不会保留(并且由于某些内部数据结构而无法保留)被丢弃在JList

JList 的默认视觉反馈是一个类似行的光标提示它将被添加到哪里。如果我使用默认值,当用户发现项目被添加到列表末尾时,用户会感到困惑,而不是光标显示的位置。

为了使视觉反馈看起来更容易,我在 JPanel 级别上进行操作(一个 JPanel 对应一个 JList,列表上的一些半透明覆盖层等等)。自然,拖放到该 JPanel 也应该添加到列表中。所以....

【问题讨论】:

  • “这样做的正确方法是什么?” 嗯.. 不要这样做,因为它不是“最少的路径”给最终用户带来惊喜?
  • @AndrewThompson 事实上,我这样做是为了减少惊喜。查看更新后的问题。
  • 不要以为这很奇怪,这就是 f.i. win文件资源管理器:将一个目录从树中拖到另一个目录的文件列表视图中,当超过一个文件时,会显示一条指示当前插入位置的黑线,但在拖放时会根据排序顺序插入该目录
  • 我同意@kleopatra。我认为典型的文件浏览器默认选择插入的文件以可视化向用户显示它放置的位置,因为实际位置与放置位置不同。好东西,否则我的文件夹都没有按字母顺序排列的文件,我再也找不到任何东西了
  • @kleopatra,你在winxp中试过了吗?这里的资源管理器没有显示“黑线”,它从不插入排序顺序——它只是将它添加到列表的末尾。

标签: java swing drag-and-drop droptarget


【解决方案1】:

放置位置的视觉反馈由单元格渲染器处理。删除的一个肮脏技巧是自定义渲染器在这方面什么都不做(请注意,逻辑不完整,您可能必须处理“真实”选择案例):

    ListCellRenderer renderer = new DefaultListCellRenderer() {

        @Override
        public Component getListCellRendererComponent(JList list,
                Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected,
                    cellHasFocus);
            JList.DropLocation dropLocation = list.getDropLocation();
            if (dropLocation != null
                    && !dropLocation.isInsert()
                    && dropLocation.getIndex() == index) {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }

    };

与安装在列表和包含面板上的自定义 transferHandler 相结合,应该非常接近您的需要(在其 importData 中,将项目添加到列表末尾,选择新条目并滚动到它)

【讨论】:

  • 你正在处理 JList... 有什么方法可以将 drop 委托给父 JPanel?
【解决方案2】:

如果您不需要保留 JList 拖放处理,实现此目的的最简单方法是将其 TransferHandler 设置为 null。假设它的父级有一个 TransferHandler 集,它会自动处理拖放事件。

【讨论】:

  • 酷 - 我今天的学习项目,以及 OP 正在寻找的内容 :-)
猜你喜欢
  • 2013-05-13
  • 2015-03-14
  • 2015-11-02
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多