加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JList – 单击已选择的项目时,取消选择

发布时间:2020-12-14 05:34:52 所属栏目:Java 来源:网络整理
导读:如果点击JList上的选定索引,我希望它取消选择.换句话说,点击索引实际上会切换他们的选择.看起来不像这样被支持,所以我试过 list.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent evt) { java.awt.Point point = evt.getPoint();
如果点击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);
   }
});

这里的问题是在JList已经对鼠标事件进行操作后被调用,所以它会取消选择所有内容.所以我试图删除所有的JList的MouseListener,添加自己的,然后添加所有的默认监听器.这没有工作,因为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);

…和那个工作.但我不喜欢有没有更好的办法?

解决方法

看一下示例“ListSelectionModel:启用切换选择模式”:
http://java.sun.com/products/jfc/tsc/tech_topics/jlist_1/jlist.html

我已经对多选列表框进行了修改(将setSelectionInterval更改为addSelectionInterval),如果您在鼠标停止时单击以取消选择并移动鼠标,则可以消除重新选择的问题(移动手势启动检查以进行添加和去掉).

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;
        }
    }

});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读