【问题标题】:I'm trying to remove items from a jList我正在尝试从 jList 中删除项目
【发布时间】:2012-02-27 14:08:12
【问题描述】:

我对 Java 很陌生,使用 Visual Basic 已经有几年了。我使用 NetBeans 创建了一个基本的 GUI。它包含一个名为 lstMain 的 jList。我创建了一个名为 LISTMODEL 的 DefaultListModel,我可以将字符串项添加到 jList。当我尝试使用

删除项目时
int M = lstMain.getSelectedIndex();
LISTMODEL.remove(M);

奇怪的事情发生了。有时会删除列表项,从而减少一项。这是我所期望的。有时列表项似乎保留在原处,未更改,但最后一项无法访问。如果我点击一个可访问的项目,它会变成我所期望的——即下一个项目是什么。有时项目确实发生了变化,但最后一个仍然无法访问。这一切似乎与 Visual Basic 列表框的易用性相去甚远。谁能告诉我这是怎么回事?

【问题讨论】:

  • 请阅读this
  • 由于您是 Java 新手,请阅读oracle.com/technetwork/java/javase/documentation/…。非常推荐。
  • 请发SSCCE
  • @twall 无需手动使任何内容无效 - 模型将通知其侦听器,所有内部更新将自动发生 :-)
  • 当你在阅读和学习时 - 请学习 java 命名约定并遵守它们:-)

标签: java swing jlist


【解决方案1】:

对我来说很好 - 试试这个 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);
    }
}

【讨论】:

    【解决方案2】:

    确保您对 listModel 的更改发生在事件调度线程 (EDT) 中。

    具体来说,使用这个:

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

    【讨论】:

    • 是的——例如,如果您从 JButton 触发 remove(),那么您已经在 EDT 中,因此不需要 invokeLater()。
    • 请学习 java 命名约定并遵守它们 (konnte ich mir jetzt nicht verkneifen aka SCNR :-)
    • @kleopatra Steve 引用了 OP 的代码,所以这有点苛刻!
    • @DNA 我知道这一点,正如您在我的评论末尾看到的那样,没有苛刻的意思 :-) 另一方面,我认为有经验的开发人员不应该简单地引用糟糕的风格来自新手问题,但更正最明显的错误并提示他们为什么更改它
    • @kleopatra 好的,抱歉,完全错过了“SCNR”!
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2012-03-13
    • 2011-07-09
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多