Элемент, вставленный в пользовательскую ListModel, автоматически выбирается, если между двумя выбранными значениями - PullRequest
1 голос
/ 31 июля 2011

Я заметил, что когда элемент добавляется в 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 Ответ

2 голосов
/ 31 июля 2011

Это не проблема, но я считаю, что вы должны использовать Swing Timer вместо Executor, чтобы код выполнялся на EDT.

Да, проблема заключается в выборе модели. В последний раз, когда я смотрел на код, он показался мне довольно запутанным, поэтому я не уверен, что вы хотите поиграть с ним.

Единственное, о чем я могу думать, это убедиться, что вы используете интервал множественного выбора. Затем после вставки элемента вы проверяете, выбран ли элемент. Если это так, вы удаляете выделение для этого элемента.

...