2012-03-29 13 views
1

私は任意の数の要素を持つjlistを持っています。私はリストから3つの要素だけを選択するようにユーザーを制限したいと思います。これまで、リスト選択リスナーを作成しそこからコーディングする以外に、本当に便利な方法は見つけられませんでした。Jlistの最大数選択された要素の最大数

スイングでは、組み込みの方法やベストプラクティスはありますか?

答えて

5

カスタマイズした選択モデルを実装します。例えば、以下のようになる。

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setSize(800, 600); 

    JList list = new JList(new Object[]{"111","111","111","111","111","111","111"}); 
    list.setSelectionModel(new MySelectionModel(list, 3)); 
    frame.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER); 

    frame.setVisible(true); 
} 

private static class MySelectionModel extends DefaultListSelectionModel 
{ 
    private JList list; 
    private int maxCount; 

    private MySelectionModel(JList list,int maxCount) 
    { 
     this.list = list; 

     this.maxCount = maxCount; 
    } 

    @Override 
    public void setSelectionInterval(int index0, int index1) 
    { 
     if (index1 - index0 >= maxCount) 
     { 
      index1 = index0 + maxCount - 1; 
     } 
     super.setSelectionInterval(index0, index1); 
    } 

    @Override 
    public void addSelectionInterval(int index0, int index1) 
    { 
     int selectionLength = list.getSelectedIndices().length; 
     if (selectionLength >= maxCount) 
      return; 

     if (index1 - index0 >= maxCount - selectionLength) 
     { 
      index1 = index0 + maxCount - 1 - selectionLength; 
     } 
     if (index1 < index0) 
      return; 
     super.addSelectionInterval(index0, index1); 
    } 
} 
+0

私はこのソリューションが大好きです、ありがとう! – monknomo

+0

複数の選択のために "SHIFT"キーを押しても、この解決法は機能しません。 – Jimmy

0

ListSelectionModelをご覧ください。およびDefaultListSelectionModel

このインターフェイスは、安定したインデックスを持つ値のリストを表示するコンポーネントの選択の現在の状態を表します。選択は一連の間隔としてモデル化され、各間隔は選択されたリスト要素の連続した範囲を表します。選択された間隔のセットを変更する方法はすべて、閉じた間隔を表すインデックス、index0およびindex1のペアをとる。すなわち、間隔はindex0およびindex1の両方を含む。

あなたでしサブクラスDefaultListSelectionModelとはaddSelectionInterval(int index0, int index1)setSelectionInterval(int index0, int index1)メソッドをオーバーライドします。残念ながら、internalsDefaultListSelectionModelはプライベートとマークされているため、選択した行を表すビットセットにはアクセスできません(リフレクションに戻らずに簡単にアクセスできます)。 getMinSelectionIndex()からgetMaxSelectionIndex()へのすべての行の繰り返しとisSelectedIndex()のクエリ以外の方法で、選択カウントを取得する方法はありません。

+0

chenyi1976は、選択モデルにJListへの参照を保持させることによって、どの行が選択されているかを知る問題を解決します。それはうまくいく... –

0

私はこれを解決しようとしましたが、今までは限界に達しているかどうかを判断できましたが、まだ選択が可能です。誰かが自分のコードを改善するかもしれない。

ここに私がしたことがあります。私は整数配列のインデックスを宣言しました。 に続い

int indices[]; 

、私はその後、最大選択に対してそれを検証配列に選択されたインデックスを保存しました。

public class ListListener implements ListSelectionListener{ 
    public void valueChanged(ListSelectionEvent e){ 
     indices = list.getSelectedIndices(); 
     if(indices.length > max){ 
     System.out.println("you can only select " + max + " items"); 
     /* place a code here that prevents further more selection or 
      still allows selection only to deselect the last selected item/element 
     */ 
     } 
    } 
} 
関連する問題