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