私が気づいたのは、要素が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++;
}
}
}
「これはどのように修正するのですか?質問、私は本当にそれが起こる理由を理解したいと思います。ユーザーが自分のリストから値を選択すると、値以上のものが選択され、選択されたものが相互作用します。デフォルトモデルと別のクラスとのやりとりをするのではなく、SelectionModelにすべてカプセル化したいと思っています。私はちょうどデフォルトを包むことができると思います... – Dogmatixed
私はこれが多くのコンポーネントの正常な動作だと思います。強調表示されたテキストを含むWord文書を編集することを検討してください。途中にテキストを挿入すると、同じハイライトが継承されます。強調表示の仕方は開始/終了範囲を維持することで、中央に追加すると範囲が拡大されます。同じように動作する行選択に対してデフォルトの動作を持たせることとの違いはありません。 – camickr
私は同意します。コードを選択モデルにカプセル化するのが好ましい方法です。私はそれがどれくらい簡単か難しいか分かりません。 – camickr