我想将JList
的“drop”事件委托给其父(JPanel
),并删除在JList上删除的视觉反馈。
这样做的正确方法是什么?
我正在尝试创建一个DropTarget
对象并在JPanel和JList之间共享它,但它似乎有点hackish ---我无法弄清楚DropTarget.getComponent()
应该做什么和担心它可能会破坏东西。
您能否建议正确的方法(在Java 6中)?
修改 * 为什么我这样做? *
我试图让用户将项目放入组(一个JPanel +一个JList =一个组) - 当项目时,列表顺序将不会被保留(并且由于某些内部数据结构而无法保留)被删除JList
。
JList
的默认视觉反馈是一个类似于线条的光标,暗示它将被添加到哪里。如果我使用默认值,当用户发现项目被添加到列表末尾而不是光标显示的位置时,用户会感到困惑。
为了让视觉反馈看起来更容易,我在JPanel级别上做(一个JPAnel用于一个JList,一些半透明覆盖在列表和东西上......)。当然,放到那个JPanel也应该添加到列表中。所以....
答案 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,它将自动处理拖放事件。