繁体   English   中英

如果未单击任何项​​目,如何清除JTable和JList中的选择?

[英]How to clear selection in JTable and JList if no item is clicked?

我在这里寻找此答案,但找不到,所以如果有人需要,我在下面写我自己的答案。

如有需要,请随时纠正。

因此,为了针对这两种情况(JList和JTable)提供解决方案,我制作了一个自定义侦听器,该侦听器将应用于有问题的列表和表。

听众是:

public class DeselectOnClickListener extends MouseAdapter
{   
    @Override
    public void mouseClicked(MouseEvent e) {
        super.mouseClicked(e);
        clearselection(e);      
    }

    @Override
    public void mousePressed(MouseEvent e) {
        super.mousePressed(e);
        clearselection(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        super.mouseReleased(e);
        clearselection(e);
    }

    public void clearselection (MouseEvent e){      
        if (e.getComponent() instanceof JTable){
            Point pClicked = e.getPoint();
            JTable table = (JTable) e.getSource();
            int index = table.rowAtPoint(pClicked);
            if (index == -1){
                table.clearSelection();
            }

        } else if (e.getComponent() instanceof JList){
            Point pClicked = e.getPoint();
            JList<?> list = (JList<?>) e.getSource();
            int index = list.locationToIndex(pClicked);
            Rectangle rec = list.getCellBounds(index, index);
            if (rec==null || !rec.contains(pClicked)){
                list.clearSelection();
            }
        }
    }
}

注意,这在SINGLE_SELECCTION效果很好,但是如果我们要使用MULTIPLE_INTERVAL_SELECTIONSINGLE_INTERVAL_SELECTION我建议不要覆盖mouseReleased(MouseEvent e)因为如果在选择范围之外释放鼠标按钮,它将清除选择。

PD:对于这一点,我做了以下修复:

@Override
    public void mouseReleased(MouseEvent e) {
        super.mouseReleased(e);
        if (! isIntervalSelectionMode(e)){
            clearselection(e);
        }
    }

    public boolean isIntervalSelectionMode (MouseEvent e){
        boolean isIntervalSelection = false;
        if (e.getComponent() instanceof JTable){
            isIntervalSelection = ((JTable)e.getSource()).getSelectionModel().getSelectionMode() 
                        != ListSelectionModel.SINGLE_SELECTION;
        }else if (e.getComponent() instanceof JList){
            isIntervalSelection = ((JList<?>)e.getSource()).getSelectionModel().getSelectionMode() 
                    != ListSelectionModel.SINGLE_SELECTION;
        }
        return isIntervalSelection;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM