此处提出了一个非常相似的问题,虽然我承认这一点,但问题的解决方案并不能完全解决我的问题。A JList
,当单击时,将选择最接近鼠标单击的索引列表项。AJList
也将为每次单击+拖动事件触发执行此操作。
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
,都会收到我添加到上述方法中的 System.out 消息“setSelectionInterval”。就覆盖方法而言,我不知道从哪里开始。也许这不是我应该处理的方式。在源代码中,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);
}
}