2012-03-05 3 views
3

ListSelectionModelの独自の実装を作成しようとしていますが、現在insertIndexIntervalを実装しようとしているうちに固執しています。 Sunの/ OracleのDefautListSelectionModelの実装では、この方法の結果はわかりません。次に例を示します。ListSelectionModel.insertIndexInterval()は何をしていますか?

ListSelectionModel model = new DefaultListSelectionModel(); 
model.setSelectionInterval(3, 5); 
model.addListSelectionListener(new ListSelectionListener() 
{ 
    public void valueChanged(ListSelectionEvent e) 
    { 
     System.out.println("Changed range reported by event: " + 
      e.getFirstIndex() + "-" + e.getLastIndex()); 
    } 
}); 

System.out.print("Selected indices before insert: "); 
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++) 
    if (model.isSelectedIndex(i)) System.out.print(i + " "); 
System.out.println(); 

model.insertIndexInterval(3, 3, true); 

System.out.print("Selected indices after insert: "); 
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++) 
    if (model.isSelectedIndex(i)) System.out.print(i + " "); 
System.out.println(); 

あなたはこのコードを実行するときは、この出力を取得します:

Selected indices before insert: 3 4 5 
Changed range reported by event: 3-8 
Selected indices after insert: 3 4 5 6 7 8 

だから、最初の選択は3-5だったし、新しいインデックスを挿入するとき、それは3-8に拡張されました。しかし、3-5はすでに選択されているので、実際の変更は6-8にすぎないので、3から8の範囲が変更されたというイベントがどうして私に伝えられるのですか?私は報告の変化が5-8である理由はわかりません

Selected indices before insert: 3 4 5 
Changed range reported by event: 5-8 
Selected indices after insert: 3 4 5 6 7 8 

model.insertIndexInterval(3, 3, false); 

今、出力はこれです:あなたはこれにinsertIndexInterval呼び出しに変更する場合にはさらに混乱です。

このメソッドのAPIドキュメントは、あまりにも短いので、そこで何が起こっているのか理解できません。特にこのbeforeパラメータは、選択に何の影響も与えないので、私にとっては不思議ですが、イベントやリードとアンカーのインデックスに何らかの影響を与えるようです。

予想される結果がわからないため、私の実装の単体テストも書けません。

誰かがこの方法(特にbeforeフラグ)が何をしているのか、それが選択モデルとListSelectionEventにどのような副作用があるのか​​を詳しく説明できますか?私たちはJListの程度ではなく、JTableのについて話していることを願ってい

答えて

4

は、それが使用されている、唯一のdimensionまたはdirectionalを持っています。 2つの手段は、あなたの出力が可能であろうよりも「新しく追加され、選択された」の場合:

あなたはここを参照してください何
[0,0,0,1,1,1,0,0,0,0] == [3A,4,5L] 
-> add after [0,0,0,1,2,2,2,1,1,0] == [3A,4,5,6,7,8L] 
-> add before [0,0,0,2,2,2,1,1,1,0] == [3,4,5,6A,7,8L] 

DefaultListSelectionModelでの機能*である - 現在の選択内のインデックスを追加して、自動的に選択が拡張されます。

スタート選択されたインデックス1と、たとえば、インデックス3の3行を挿入して:あなたの選択の表現は誤解を招くおそれがあり

[1,0,0,0,0,0,0,0,0,0] 
-> add after [1,0,0,0,0,0,0,0,0,0] 

注意を、ゼロではない実際にそこにあります。選択状態になり、印刷するためのより良い方法:

private static void printSelection(ListSelectionModel model) { 
    System.out.print("["); 
    for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++) { 
     if(i > model.getMinSelectionIndex()) { 
      System.out.print(","); 
     } 
     if(model.isSelectedIndex(i)) { 
      System.out.print(i); 
      if(i == model.getAnchorSelectionIndex()) { 
       System.out.print("A"); 
      } 
      if(i == model.getLeadSelectionIndex()) { 
       System.out.print("L"); 
      } 
     } 
    } 
    System.out.println("]"); 
} 

*)DefaultListSelectionModelで#insertIndexIntervalのドキュメントはインタフェースとは異なり、またhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4700643http://java.net/jira/browse/SWINGX-272

+0

はい、私はゼロが本当にそこにないことを知っています。そのように比較するほうが簡単です。しかし、私はまだそれを取得しません。このイベントは、データモデルではなく選択モデルにバインドされています。指標3-5は、新しいデータを挿入する前にすでに選択されていたため、実際の変更(データモデルではなく選択モデルに対する)が6-8の追加選択範囲のみでした。しかし、報告された変化は3-8(前に=真)と5-8(前に=偽)です。特にこの5-8は今のところ意味がありません。 – kayahr

+1

はい、それは3-8(1が移動され、2が追加されたため)について説明しますが、before = falseを使用すると報告された5-8範囲についてはどう説明しますか? 3状態として視覚化する場合、3つの1は動かず、3つの2は5ではなく、インデックス6に挿入されるので、6-8でなければなりません。 – kayahr

+1

BTW:インデックス3の後に挿入すると0001222110になります。 0001112220ではありませんか?ドキュメントには、「インデックスの前後に開始する長さインデックスを挿入する」と書かれています。 – kayahr

-2

EDITは、その後、残りの部分は、あなたがこのSSCCEを使用して明確にListSelectionModelListeSelectionModeおよび関連コードのとあなたの問題をdomostratingコードをあなたの質問を編集してくださいすることができ、通知に

です回避策は、noticeこのListenerは、新しいデータがデータモデル(その現在の選択インデックスを移動しなければならない)に追加されたときに

import java.awt.Component; 
import java.awt.event.InputEvent; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

public class Ctrl_Down_JList { 

    private static void createAndShowUI() { 
     String[] items = {"Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"}; 
     JList myJList = new JList(items) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      protected void processMouseEvent(MouseEvent e) { 
       int modifiers = e.getModifiers() | InputEvent.CTRL_MASK; 
       // change the modifiers to believe that control key is down 
       int modifiersEx = e.getModifiersEx() | InputEvent.CTRL_MASK; 
       // can I use this anywhere? I don't see how to change the modifiersEx of the MouseEvent 
       MouseEvent myME = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), modifiers, e.getX(), 
         e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); 
       super.processMouseEvent(myME); 
      } 
     }; 
     JFrame frame = new JFrame("Ctrl_Down_JList"); 
     frame.getContentPane().add(new JScrollPane(myJList)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
+1

を参照してくださいあなたの投稿コードがで行うには全く関係ありません質問。 –

+0

@Walter Laanあなたは正しいですが、なぜSelectionModeを知らずに迷惑を掛けていても、あなたの答えに記述しているように物事は簡単になります。+1は気になります。EDITと残りは答えのコメントに表示されます:-) – mKorbel

+0

私は、完全なコード例を追加しました。私はそれが私の問題を十分に示すことを願っています。 – kayahr

関連する問題