Java 我正在尝试从jList中删除项目

Java 我正在尝试从jList中删除项目,java,swing,jlist,Java,Swing,Jlist,我对Java非常陌生,已经使用VisualBasic好几年了。我已经使用NetBeans创建了一个基本的GUI。它包含一个名为lstMain的jList。我已经创建了一个名为LISTMODEL的DefaultListModel,我可以向jList添加字符串项。当我尝试使用删除项目时 int M = lstMain.getSelectedIndex(); LISTMODEL.remove(M); 奇怪的事情发生了。有时列表项被删除,只剩下一项。这就是我所期望的。有时列表项似乎保持不变,但最后一项

我对Java非常陌生,已经使用VisualBasic好几年了。我已经使用NetBeans创建了一个基本的GUI。它包含一个名为lstMain的jList。我已经创建了一个名为LISTMODEL的DefaultListModel,我可以向jList添加字符串项。当我尝试使用删除项目时

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

奇怪的事情发生了。有时列表项被删除,只剩下一项。这就是我所期望的。有时列表项似乎保持不变,但最后一项不可访问。如果我点击一个可访问的项目,它就会变成我所期望的——即下一个项目是什么。有时项目确实会更改,但最后一个项目仍然无法访问。这与VisualBasic列表框的易用性似乎相差甚远。有人能告诉我发生了什么吗?

确保您对listModel的更改正在事件调度线程EDT中进行

具体而言,使用以下术语:

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

适合我-试试这个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);
    }
}

请阅读。由于您是Java新手,请阅读本文。这是非常推荐的。请发布@twall无需手动使任何内容无效-模型将通知其侦听器,所有内部更新将自动进行:-当您阅读和学习时-请学习java命名约定并遵守它们:-是-尽管您正在触发从JButton移除,例如,那么你就已经在EDT中了,所以不需要调用器了。请学习java命名约定并坚持使用它们。我是mir jetzt nicht verkneifen aka SCNR:-@kleopatra Steve引用了OP的代码,所以这有点苛刻@DNA我知道这一点,正如你在我的评论结尾所看到的,没有严厉的意思:-另一方面,我认为有经验的开发人员不应该简单地引用新手问题中的坏风格,而是纠正最明显的错误,并暗示他们为什么会改变it@kleopatra好的,对不起,完全错过了SCNR!