Я пытаюсь удалить элементы из jList - PullRequest
0 голосов
/ 27 февраля 2012

Я очень новичок в Java, пользуясь Visual Basic в течение нескольких лет. Я создал базовый графический интерфейс с использованием NetBeans. Он содержит jList, называемый lstMain. Я создал DefaultListModel с именем LISTMODEL, и я могу добавить строковые элементы в jList. Когда я пытаюсь удалить элементы, используя

int M = lstMain.getSelectedIndex();
LISTMODEL.remove(M);

странные вещи случаются. Иногда элемент списка удаляется, оставляя на один элемент меньше. Это то, что я ожидал. Иногда элементы списка остаются неизменными, но последний элемент недоступен. Если я нажму на доступный элемент, он изменится на то, что я ожидал, то есть на следующий элемент. Иногда предметы меняются, но последний по-прежнему недоступен. Все это, кажется, далеко от простоты использования списка Visual Basic. Может кто-нибудь сказать мне, что происходит?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Работает нормально для меня - попробуйте это SSCCE:

public class SimpleList
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("List example");
        final DefaultListModel model = new DefaultListModel();
        model.addElement("Hello");
        model.addElement("World");

        final JList list = new JList(model);
        frame.add(list, BorderLayout.CENTER);

        JButton remove = new JButton("Remove");
        remove.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int sel = list.getSelectedIndex();
                if (sel >= 0)
                {
                    model.removeElementAt(sel);
                }
            }
        });

        frame.add(remove, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }
}
0 голосов
/ 27 февраля 2012

Убедитесь, что ваши изменения в listModel происходят в потоке отправки событий (EDT).

В конкретных терминах используйте это:

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            int M = lstMain.getSelectedIndex();
            LISTMODEL.remove(M);
        }
    });
...