Swing委托drop事件到父容器

时间:2012-01-26 07:41:57

标签: java swing drag-and-drop droptarget

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

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

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

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

修改 * 为什么我这样做? *

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

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

为了让视觉反馈看起来更容易,我在JPanel级别上做(一个JPAnel用于一个JList,一些半透明覆盖在列表和东西上......)。当然,放到那个JPanel也应该添加到列表中。所以....

2 个答案:

答案 0 :(得分: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中,将项目添加到列表的末尾,选择新条目并滚动到它)

答案 1 :(得分:1)

如果您不需要保留JList拖放处理,最简单的方法是将其TransferHandler设置为null。假设其父级设置了TransferHandler,它将自动处理拖放事件。