1

要素がJListに追加され、その要素が選択された値の範囲内にある場合、デフォルトで選択されることになります。実際、要素が選択された値のすぐ上に追加されると、その要素は選択範囲に追加されます。

JListコード(オープンJDK6内)と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++;
        }

    }
}
4

1 に答える 1

2

これは問題ではありませんが、コードがEDTで実行されるように、エグゼキューターの代わりにSwingタイマーを使用する必要があると思います。

はい、問題は選択モデルです。前回コードを調べたとき、かなり混乱していることがわかったので、それを試してみたいかどうかはわかりません。

私が考えることができる唯一のことは、複数選択間隔を使用していることを確認することです。次に、要素を挿入した後、要素が選択されているかどうかを確認します。その場合は、その要素の選択を削除します。

于 2011-07-31T19:12:36.840 に答える