2011-07-31 14 views
1

私が気づいたのは、要素がJListに追加され、その要素が選択された値の範囲内にある場合、デフォルトでは実際、選択した値のすぐ上に要素が追加された場合、その要素は選択範囲に追加されます。カスタムListModelに挿入された要素は、2つの選択された値の間に自動的に選択されます

オープンJDK6のJListコードとBasicListUIコードを調べてみましたが、なぜこれが起こるのか、それを修正するために何をする必要があるのか​​を詳しく調べるのに困っています。

カスタムSelectionModelを提供することを検討しています。これは、アプリケーションで他の作業を実行するのに理にかなった場所ですが、問題を悪化させるか、修正するのが難しいかもしれません。誰がなぜこれが起こるのか知っていますか?私はそれを修正するために何ができますか?

私は問題を示しています。この例を作成しました:

package jlistsscce; 

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 

public class JListSSCCE extends JPanel 
{ 
    private final JList list; 
    private ScheduledExecutorService ses; 

    public JListSSCCE() 
    { 
     list = new JList(); 
     list.setModel(new DefaultListModel()); 
     ses = Executors.newSingleThreadScheduledExecutor(); 
     ses.scheduleAtFixedRate(new NewElement(), 100, 100, TimeUnit.MILLISECONDS); 
     add(list); 
    } 

    private static void createGui() 
    { 
     // create new JFrame 
     JFrame jf = new JFrame("JListSSCCE"); 

     // this allows program to exit 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // You add things to the contentPane in a JFrame 
     jf.getContentPane().add(new JListSSCCE()); 

     // size frame 
     jf.pack(); 

     // make frame visible 
     jf.setVisible(true); 

    } 

    public static void main(String[] args) 
    { 
     // threadsafe way to create a Swing GUI 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() 
       { 
        createGui(); 
       } 
      } 
     ); 
    } 

    private class NewElement implements Runnable 
    { 
     int n = 0; 
     @Override 
     public void run() 
     { 
      ((DefaultListModel)list.getModel()).add((int)Math.floor(Math.sqrt(n)), ("hey"+n)); 
      n++; 
     } 

    } 
} 

答えて

2

は、これは問題ではありませんが、私はコードがEDT上で実行されますので、あなたの代わりにエグゼキュータのスイングタイマーを使用しなければならないと考えています。

はい問題は選択モデルです。私が最後にコードを見たとき、私はちょっと混乱していましたので、あなたはそれを試してみたいとは思っていません。

私が考えることができるのは、複数の選択間隔を使用していることを確認することだけです。 elemntを挿入した後、要素が選択されているかどうかを確認します。そうであれば、その要素の選択を削除します。

+0

「これはどのように修正するのですか?質問、私は本当にそれが起こる理由を理解したいと思います。ユーザーが自分のリストから値を選択すると、値以上のものが選択され、選択されたものが相互作用します。デフォルトモデルと別のクラスとのやりとりをするのではなく、SelectionModelにすべてカプセル化したいと思っています。私はちょうどデフォルトを包むことができると思います... – Dogmatixed

+1

私はこれが多くのコンポーネントの正常な動作だと思います。強調表示されたテキストを含むWord文書を編集することを検討してください。途中にテキストを挿入すると、同じハイライトが継承されます。強調表示の仕方は開始/終了範囲を維持することで、中央に追加すると範囲が拡大されます。同じように動作する行選択に対してデフォルトの動作を持たせることとの違いはありません。 – camickr

+0

私は同意します。コードを選択モデルにカプセル化するのが好ましい方法です。私はそれがどれくらい簡単か難しいか分かりません。 – camickr

関連する問題