有一个非常类似的问题被问到here,虽然我承认,问题的解决方案并没有完全解决我的问题。单击JList
时,将选择最接近鼠标单击的索引列表项。 JList
也会针对每次点击+拖动事件触发执行此操作。
当单击+拖动位置在可见列表之外时,我想阻止我的JList
在点击+拖动事件期间选择项目。我该怎么做呢?
我考虑过覆盖一个不同的方法,一个参与点击+拖动选择列表项的事件。我想尝试setSelectionInterval()
方法。
JList<String list = new JList<String>(){
private static final long serialVersionUID = 1L;
@Override
public int locationToIndex(Point location) {
int index = super.locationToIndex(location);
if (index != -1 && !getCellBounds(index, index).contains(location)) {
clearSelection();
return -1;
//an excellent click-only solution to prohibit the selecting of
//items from beyond the visible list
}
else {
return index;
}
}
@Override
public void setSelectionInterval(int anchor, int lead) {
super.setSelectionInterval(anchor, lead);
System.out.println("setSelectionInterval");
}
};
我发现每次点击+拖动显示的JList
上的任何地方,我都会收到上面方法中添加的“setSelectionInterval”的System.out消息。就覆盖方法而言,我不知道从哪里开始。也许这不是我应该如何处理这个问题。在setSelectionInterval()
的源代码中,我迷失了,试图找到我所涉及的任何听众,所以我来到这里。 :P
我非常感谢任何指向我应该寻找的地方或完全解决方案。提前谢谢!
这是一个接近我如何设置的SSCCE示例。实际上,当从列表项本身触发单击事件时,列表不会选择项目。我希望当从列表项中触发点击+拖动事件时,会发生同样的效果。
import java.awt.BorderLayout;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
public class TestMain {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel content = new JPanel(new BorderLayout());
String[] data = {"Luke", "Jeff", "Bryce"};
JList<String> list = new JList<String>(data){
private static final long serialVersionUID = 1L;
@Override
public int locationToIndex(Point location) {
System.out.println("location to index");
int index = super.locationToIndex(location);
if (index != -1 && !getCellBounds(index, index).contains(location)) {
clearSelection();
return -1;
}
else {
return index;
}
}
}
content.add(list, BorderLayout.CENTER);
frame.setContentPane(content);
frame.setSize(200,200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
答案 0 :(得分:3)
如果可以接受禁用整个拖动功能,则以下内容应该有所帮助:
@Override
protected void processMouseMotionEvent(MouseEvent e) {
if(MouseEvent.MOUSE_DRAGGED != e.getID()) {
super.processMouseMotionEvent(e);
}
}
答案 1 :(得分:2)
当单击+拖动位置在可见列表之外时,我想阻止我的JList在点击+拖动事件期间选择项目。
不确定我理解这个要求。让我们从选择的第一行开始。
如果单击第一行然后继续拖动到第二行,则第二行会突出显示。继续拖动,第3行突出显示。继续拖过第3行,你想要发生什么?
您是说要选择第一行,因为这是您开始的地方?如果这是你要问的,那么你需要查看BasicListUI。这是将鼠标侦听器添加到JList的位置。您将以某种方式需要处理mousePressed事件以保存当前选定的行。然后,当您开始在最后一行之外拖动时,您将以某种方式覆盖mouseDragged代码的默认行为以重置所选行。
我不知道如何做到这一切。
我收到&#34; setSelectionInterval&#34;的System.out消息我添加到上面的方法
试图覆盖该方法中的代码为时已晚。拖动鼠标时,选择将继续更新。您不知道是否正在调用此方法,因为鼠标实际位于最后一行或最后一行,因为您无法访问鼠标点。
我想您可以尝试使用MouseInfo类来确定调用此方法时鼠标的位置,但是不知何故,您仍然需要知道在选择第一行时最初开始拖动。我也不知道怎么做。