【发布时间】:2014-07-27 12:56:39
【问题描述】:
我正在使用拖放操作。用户必须将某些内容从列表中拖到其他地方。但是,当收到ListSelectionEvent 时列表会移动,因此当用户更改选择时,他可能会意外执行拖放操作。
我的代码:
import java.awt.*;
import javax.swing.*;
class Main {
public static void createGUI() {
JFrame f = new JFrame();
JList<String> list = new JList<>(new String[] { "Text A", "Text B" });
list.setFont(list.getFont().deriveFont(24f));
list.setDragEnabled(true);
// list.setTransferHandler(new TransferHandler() { /* ... */ });
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addListSelectionListener(e -> f.setLocation(f.getX(),
f.getY() + f.getHeight()));
list.setSelectedIndex(0);
f.add(list, BorderLayout.CENTER);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationByPlatform(true);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(Main::createGUI);
}
}
要重现,请启动此应用程序,将其放在某个接受拖放的应用程序(例如 Eclipse、Notepad++)上方并多次切换选择。
我使用的是 Windows 7 和 JDK 1.8.0_5。
我试过了,但找不到解决方法。 如何解决此问题?
[不太相关]这是我的真实应用:(包括绿色十字图标)
【问题讨论】:
-
测试您的代码后的最终用户想法:1) 我真的很讨厌以这种方式运行的应用程序。我的意思是,在选择事件上移动列表有什么意义?如果我使用 DnD,我希望组件保持安静,这样我就可以在视觉上仔细检查我正在拖动正确的列表项。 2) 正如您所指出的,移动列表很容易出现意外下降。 3) 我知道这只是一个示例,但在进行两次选择后,我的屏幕上不再显示该框架。
-
@dic19 加油!我对您的第一点和第三点进行了更新。
-
那么,您不想在任何地方使用拖放效果,还是想修改它的放置位置? (另外,我想我发现了 DnD 使用中最奇怪的极端案例;)。)
-
@dudeprgm 当它拖动时。
-
只要确保我在这里给出正确答案:您想在用户拖动时收到通知,对吗? (如果你想完全禁用 DnD,只需使用
list.setTransferHandler(null),但我认为这不是你想要的。)
标签: java swing drag-and-drop