如果在两个选定值之间,则自动选择插入到自定义ListModel中的元素

时间:2011-07-31 18:51:57

标签: java swing selection jlist defaultlistmodel

我注意到,当一个元素被添加到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++;
        }

    }
}

1 个答案:

答案 0 :(得分:2)

这不是问题,但我相信您应该使用Swing Timer而不是Executor,以便在EDT上执行代码。

是的,问题是选择模型。我最后一次查看代码时发现它比较混乱,所以我不确定你是否想玩它。

我唯一能想到的是确保您使用多个选择间隔。然后在插入元素后,检查元素是否被选中。如果是,则删除该元素的选择。