如果单击JList上的选定索引,我希望它取消选择.换句话说,点击索引实际上切换了他们的选择.看起来不支持,所以我试过了
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
list.removeSelectionInterval(index, index);
}
});
Run Code Online (Sandbox Code Playgroud)
这里的问题是在 JList已经对鼠标事件起作用之后调用它,因此它取消选择所有内容.然后,我尝试删除所有JList的MouseListeners,添加我自己的,然后添加所有默认侦听器.这不起作用,因为在我取消选择后,JList会重新选择索引.无论如何,我最终想出的是
MouseListener[] mls = list.getMouseListeners();
for (MouseListener ml : mls)
list.removeMouseListener(ml);
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
final int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
list.removeSelectionInterval(index, index);
}
});
}
});
for (MouseListener ml : mls)
list.addMouseListener(ml);
Run Code Online (Sandbox Code Playgroud)
......那很有效.但我不喜欢它.有没有更好的办法?
Fur*_*ers 12
在此处查看示例"ListSelectionModel:启用切换选择模式":http: //java.sun.com/products/jfc/tsc/tech_topics/jlist_1/jlist.html
我已经针对多选列表框略微修改了它(将setSelectionInterval更改为addSelectionInterval)并且如果在鼠标停止时单击取消选择并移动鼠标,则消除了重新选择的问题(移动了gestureStarted检查添加和去掉).
objList.setSelectionModel(new DefaultListSelectionModel() {
private static final long serialVersionUID = 1L;
boolean gestureStarted = false;
@Override
public void setSelectionInterval(int index0, int index1) {
if(!gestureStarted){
if (isSelectedIndex(index0)) {
super.removeSelectionInterval(index0, index1);
} else {
super.addSelectionInterval(index0, index1);
}
}
gestureStarted = true;
}
@Override
public void setValueIsAdjusting(boolean isAdjusting) {
if (isAdjusting == false) {
gestureStarted = false;
}
}
});
Run Code Online (Sandbox Code Playgroud)
这个怎么样?
import javax.swing.DefaultListSelectionModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
public class A {
public static void main(String[] args) {
JFrame f = new JFrame("Test");
final JList list = new JList(new String[] {"one","two","three","four"});
list.setSelectionModel(new DefaultListSelectionModel(){
@Override
public void setSelectionInterval(int index0, int index1) {
if (index0==index1) {
if (isSelectedIndex(index0)) {
removeSelectionInterval(index0, index0);
return;
}
}
super.setSelectionInterval(index0, index1);
}
@Override
public void addSelectionInterval(int index0, int index1) {
if (index0==index1) {
if (isSelectedIndex(index0)) {
removeSelectionInterval(index0, index0);
return;
}
super.addSelectionInterval(index0, index1);
}
}
});
f.getContentPane().add(list);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但请注意一个副作用......如果您将模式设置为多选,例如:
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION );
Run Code Online (Sandbox Code Playgroud)
您不能通过鼠标拖动选择多个对象。Ctrl(或Shift)单击有效。我确定它可以修复,但我假设你问这个是为了单选列表......如果不修改你的问题,我们可以开始考虑多选问题的解决方案。
您始终可以使用 ListSelectionListener,而不是破译单击的点,然后将其转换为所选的项目。
http://java.sun.com/docs/books/tutorial/uiswing/examples/events/index.html#ListSelectionDemo
http://java.sun.com/docs/books/tutorial/uiswing/events/listselectionlistener.html
在上面的 java 文件链接中,有一个可以轻松改进以进行“取消选择”的实现:)
归档时间: |
|
查看次数: |
15345 次 |
最近记录: |