非常によく似た質問がここで尋ねられました。私はそれを認めますが、質問の解決策は私の質問を完全には解決しません。をクリックするJList
と、マウス クリックに最も近いインデックス リスト項目が選択されます。AJList
は、クリック + ドラッグ イベントが発生するたびにこれを行います。
JList
クリック + ドラッグの場所が表示リストの外にある場合、クリック + ドラッグ イベント中に項目を選択できないようにしたいと考えています。これについてどうすればいいですか?
リスト項目を選択するためのクリック + ドラッグ イベントに関係する別のメソッドをオーバーライドすることを検討していました。方法を試してみようと思いましたsetSelectionInterval()
。
JList<String list = new JList<String>(){
private static final long serialVersionUID = 1L;
@Override
public int locationToIndex(Point location) {
int index = super.locationToIndex(location);
if (index != -1 && !getCellBounds(index, index).contains(location)) {
clearSelection();
return -1;
//an excellent click-only solution to prohibit the selecting of
//items from beyond the visible list
}
else {
return index;
}
}
@Override
public void setSelectionInterval(int anchor, int lead) {
super.setSelectionInterval(anchor, lead);
System.out.println("setSelectionInterval");
}
};
表示された の任意の場所をクリックしてドラッグするたびにJList
、上記のメソッドに追加した「setSelectionInterval」の System.out メッセージが表示されることがわかりました。メソッドのオーバーライドに関して、ここからどこへ行くべきかわかりません。たぶん、それは私がこれにアプローチする方法ではありません。のソース コードでsetSelectionInterval()
は、関係するリスナーへの道を見つけようとして迷子になったので、ここに来ました。:p
私が探している場所や解決策へのポインタをいただければ幸いです。前もって感謝します!
これは、私のセットアップ方法に近い SSCCE の例です。そのままでは、クリックのみのイベントがリスト項目自体から離れて発生した場合、リストは項目を選択しません。クリック + ドラッグ イベントがリスト項目から離れたときに発生するのと同じ効果が発生することを望みます。
import java.awt.BorderLayout;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
public class TestMain {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel content = new JPanel(new BorderLayout());
String[] data = {"Luke", "Jeff", "Bryce"};
JList<String> list = new JList<String>(data){
private static final long serialVersionUID = 1L;
@Override
public int locationToIndex(Point location) {
System.out.println("location to index");
int index = super.locationToIndex(location);
if (index != -1 && !getCellBounds(index, index).contains(location)) {
clearSelection();
return -1;
}
else {
return index;
}
}
}
content.add(list, BorderLayout.CENTER);
frame.setContentPane(content);
frame.setSize(200,200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}