2

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

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

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

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

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

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

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

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

4

2 回答 2

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

于 2012-01-27T12:20:38.627 回答
1

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

于 2012-02-22T08:41:43.993 回答