我有一个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;
}
这就是在尝试删除所选元素之前的全部内容。
对于我的生活,我不知道为什么这不起作用!我在这里错过了一些非常愚蠢的东西吗?
令人困惑的更新
如果我使用了这段代码 - 代码中的注释解释了为什么这会如此令人困惑!ActionPerformed
:JButton
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
,因为更新的列表模型被添加到列表中就好了,并且后续操作(例如添加项目等)工作正常,直到我再次尝试再次删除项目!
感谢您尝试提供帮助 - 如果您对如何解决此问题有任何想法,请务必发帖!
问候
最大限度