【问题标题】:Java JList remove() method throws an ArrayOutOfBoundsExceptionJava JList remove() 方法抛出 ArrayOutOfBoundsException
【发布时间】:2015-03-01 17:58:22
【问题描述】:

我正在使用正确显示的 JList。但是,我无法从列表中删除元素。

JList nameList = new JList(db.getAllNames());
nameList.setVisibleRowCount(6);
nameList.setFixedCellWidth(400);

JButton removeNameButton = new JButton("Remove Name");

removeNameButton.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        String id = nameList.getSelectedValue().toString(); //valid value when button pressed
        int index = nameList.getSelectedIndex(); //valid value when value pressed

        namesList.remove(index); //ERROR
    }

JList 包含 4 个名称,它们显示完美并且似乎具有正确的索引。 (如果我检查值 System.out.println(copiersList.getModel().getSize()); 它总是显示 4

这是错误信息:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 3

奇怪的是,如果我删除 Adam,我不会收到错误消息(但显然列表没有改变并且调用 .getSize() 方法显示 4):

id selected: Adam
index selected: 0

但是,任何其他:

id selected: BobException in thread "AWT-EventQueue-0" 
index selected: 1
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1
at java.awt.Container.remove(Unknown Source)

【问题讨论】:

    标签: java swing jlist


    【解决方案1】:

    不要从 JList 本身中删除,因为 remove(...) 方法不会像您认为的那样做。实际上,它试图删除 JList 中保存的组件,就好像它是保存其他组件的 JPanel 一样,即使不存在这样的组件。而是从 JList 的 model 中删除,通常是 DefaultListModel。 DefaultListModel 类有一个removeElement(Object element) 和一个removeElementAt(int index) 方法可以帮助你。

    即。

    public void actionPerformed(ActionEvent e) {
        String id = nameList.getSelectedValue().toString(); //valid value when button pressed
        int index = nameList.getSelectedIndex(); //valid value when value pressed
    
        DefaultListModel listModel = (DefaultListModel) namesList.getModel();
        listModel.removeElementAt(index); 
    }
    

    【讨论】:

    • 基本上listModel 是一个简单的数据结构,它包含所有元素(因此删除、添加方法等),JList 只是显示来自DefaultListModel 的数据? (这是正确的吗?)
    • @gudthing:我将 JList 视为视图,将 ListModel 视为模型。模型保存对象的状态,这里是项目列表,视图显示此状态。如果你改变了模型的状态,那么这个改变应该会反映在视图中。
    • 当(模型的)状态发生变化时,JList 会动态更新。再次感谢您的回复,我想我明白了:)
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多