2

非常によく似た質問がここで尋ねられました。私はそれを認めますが、質問の解決策は私の質問を完全には解決しません。をクリックする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);
    }

}
4

2 に答える 2

3

ドラッグ機能全体を無効にしても問題ない場合は、次の方法が役立ちます。

@Override
protected void processMouseMotionEvent(MouseEvent e) {
    if(MouseEvent.MOUSE_DRAGGED != e.getID()) {
        super.processMouseMotionEvent(e);
    }
}
于 2014-05-29T12:53:46.273 に答える
2

クリック + ドラッグの場所が表示されているリストの外にある場合、クリック + ドラッグ イベント中に JList が項目を選択しないようにしたいと考えています。

要件を理解しているかどうかわかりません。選択されている最初の行から始めましょう。

最初の行をクリックしてから 2 番目の行までドラッグし続けると、2 番目の行が強調表示されます。ドラッグを続けると、3 行目が強調表示されます。3 番目の行を超えてドラッグし続けると、どうしたいですか?

最初の行を選択したいというのは、そこから始めたからですか? これがあなたの求めているものである場合は、BasicListUI を確認する必要があります。これは、マウス リスナーが JList に追加される場所です。現在選択されている行を保存するには、どうにかして mousePressed イベントを処理する必要があります。次に、最後の行の外にドラッグし始めたときに選択された行をリセットするために、mouseDragged コードのデフォルトの動作をオーバーライドする必要があります。

これをすべて行う方法がわかりません。

上記のメソッドに追加した「setSelectionInterval」の System.out メッセージを取得します。

そのメソッドのコードをオーバーライドしようとしても遅すぎます。マウスをドラッグすると、選択が更新され続けます。マウスが実際に最後の行にあるためにこのメソッドが呼び出されているのか、それともマウス ポイントにアクセスできないために最後の行を過ぎているのかはわかりません。

MouseInfo クラスを使用して、このメソッドが呼び出されたときにマウスがどこにあるかを判断できると思いますが、最初の行が選択されたときにドラッグが最初に開始されたことを知る必要があります。これを行う方法もわかりません。

于 2013-04-20T05:07:26.647 に答える