3

我有一个JList在程序运行时会更改的标准。为了让生活更轻松,我创建了一个DefaultListModel并将其分配给JList

JList CharList = new JList();
DefaultListModel CharListModel = new DefaultListModel();

CharList.setModel(CharListModel);

我可以将文件加载到列表中,稍后我可以将项目添加到列表中,如下所示:

File ChFile = new File (CharListFile);
FileReader freeder = new FileReader (ChFile);
BufferedReader breeder = new BufferedReader(freeder);
String line;
while((line=breeder.readLine())!=null)
{
int pos = CharList.getModel().getSize();
CharListModel.add(pos, line);
}
...
...
//and to add items..
int pos = CharList.getModel().getSize();
CharListModel.add(pos, NewCharName);

但是,我需要能够从列表中删除项目,这给我带来了相当大的麻烦!

我尝试了最明显的方法(是的,选择了一个项目,并且我已经检索了该索引处的索引和字符串):

CharListModel.removeElement(CharList.getSelectedValue());

但是,这给了我一个“ java.lang.ArrayIndexOutOfBoundsException: -1 ”错误。

我已经尝试了您可以在下面的代码中看到的所有排列(有些已被注释掉,但您明白了):

DefaultListModel model = (DefaultListModel) CharList.getModel();//CharListModel;
int selectedIndex = CharList.getSelectedIndex();
if (selectedIndex != -1) {
    //model.remove(selectedIndex);
    //model.removeElement(CharList.getSelectedValue());
    //model.removeElementAt(selectedIndex);
}

以及其他一些排列:

CharListModel.removeElementAt(CharList.getSelectedIndex());
//or
CharListModel.remove(CharList.getSelectedIndex());
//or
CharList.remove(SelItemIndex);

在每种情况下,我都会收到相同的“ ArrayIndexOutOfBoundsException ”错误,即使先前找到了选定的索引也没有问题。是的,我知道我刚才说的是“以前”,所以有些事情可能会改变事情,但这是在我尝试删除元素之前直接运行的代码:

int SelItemIndex = CharList.getSelectedIndex();
if(SelItemIndex == -1)
{
    JOptionPane.showMessageDialog(null, "You have to select something!");
    return;
}
String SelItem = CharList.getModel().getElementAt(SelItemIndex).toString();
//Create warning
final JComponent[] inputs = new JComponent[]
{
    new JLabel("<html>Bla Bla " + SelItem + " Are you sure?</html>")
};
int n = JOptionPane.showConfirmDialog( null, inputs,"Deletion Confirmation Warning", JOptionPane.YES_NO_OPTION);
if( n == 1)
{
    //Do not delete
    return;
}

这就是在尝试删除所选元素之前的全部内容。

对于我的生活,我不知道为什么这不起作用!我在这里错过了一些非常愚蠢的东西吗?

令人困惑的更新

如果我使用了这段代码 - 代码中的注释解释了为什么这会如此令人困惑!ActionPerformedJButton

DefaultListModel CharListModel = (DefaultListModel)CharList.getModel();
if( CharListModel.contains(CharList.getSelectedValue()) == true)
{
    //Selected item is found
    int selItemIndex = CharListModel.indexOf(CharList.getSelectedValue());
    if(selItemIndex != -1)
    {
        //Selected item index is NOT -1 and is correct
        CharListModel.remove(selItemIndex);
        //Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    }
    else
    {
        //NEVER reached
        JOptionPane.showMessageDialog(null, "OUCH!");
    }
}

如您所见,所选项目的索引直到删除它为止都是正确的,因此我再次遇到超出范围的异常。我也在同一个地方尝试过,但结果相同:

CharListModel.removeElement(CharList.getSelectedValue());

更混乱

为了弄清楚发生了什么,我创建了一个新的DefaultListModel,枚举旧的,并将每个名称放入新模型中,除了我要删除的那个(记住我可以获得索引、对象和文本,我只是不能删除它)。

这已经奏效了,我现在有一个DefaultListModel正确的项目,但是,当我尝试的那一刻,我CharList.setModel(NewModel);再次得到了越界异常。

这让我拔了头发!任何人都可以提供任何想法尝试吗?

各种各样的决议

根本不是一个真正的解决方案,但为了解决这个令人抓狂的问题,我使用了上面列出的方法,我创建了列表模型的副本,减去我想要删除的项目,然后在使用时简单地捕获异常setModel,因为更新的列表模型被添加到列表中就好了,并且后续操作(例如添加项目等)工作正常,直到我再次尝试再次删除项目!

感谢您尝试提供帮助 - 如果您对如何解决此问题有任何想法,请务必发帖!

问候

最大限度

4

4 回答 4

3

作为参考,我在此示例中添加了以下代码。如果它没有帮助,它可能是更新您的问题的有用sscce

panel.add(new JButton(new AbstractAction("Remove") {

    @Override
    public void actionPerformed(ActionEvent e) {
        int index = list.getSelectedIndex();
        if (index != -1) {
            model.remove(index);
        }
    }
}));
于 2012-07-29T10:57:49.313 回答
2

我有一个类似的问题。事实证明,错误不是源于删除元素,而是显示列表。实施时

public void valueChanged(ListSelectionEvent e)

方法会更新屏幕上的列表,请确保在设置值之前检查模型是否为空。这就是在我的情况下导致异常的原因。

创建一个列表,从那里删除,然后用列表更新模型也是一种可用的解决方法。

于 2013-12-22T02:17:02.533 回答
1

我遇到了同样的问题。似乎当从模型中删除项目时,它也会从数组中删除。因此会弄乱数组索引。

作为一种解决方法,我将数组内容移动到一个列表中,并从模​​型中删除列表内容。现在它对我来说很好。

于 2013-05-23T13:57:15.587 回答
0

我有同样的问题,我解决了这个问题:

按钮动作

int index = mylist.getSelectedIndex();
MyObject = (MyObject) mylist.getSelectedValue();
int Size = mylistmodel.getSize(); 
if (index >= 0 && MyObject != null && Size > 0) {
    modeloLista.removeElementAt(indice);
}

和。

列表值已更改

if (list.getSelectedValue() != null) {
    your code..
} 
于 2014-03-01T16:54:10.893 回答