0

ここでこの回答を探していましたが、見つからなかったので、誰かが必要な場合は、以下に独自の回答を書いています.

必要に応じて自由に修正してください。

4

1 に答える 1

0

したがって、両方のケース (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_SELECTIONmouseReleased(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;
    }
于 2012-11-03T11:22:33.307 に答える