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 の MouseListeners をすべて削除し、独自の 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);
...そしてそれはうまくいきます。しかし、私はそれが好きではありません。より良い方法はありますか?