ここでこの回答を探していましたが、見つからなかったので、誰かが必要な場合は、以下に独自の回答を書いています.
必要に応じて自由に修正してください。
したがって、両方のケース (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_SELECTION
。SINGLE_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;
}