【发布时间】:2012-07-29 10:34:01
【问题描述】:
我有一个标准的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;
}
这就是在尝试删除所选元素之前的全部内容。
对于我的生活,我不知道为什么这不起作用!我在这里错过了什么非常愚蠢的东西吗?
令人困惑的更新
在JButton 的ActionPerformed 事件中,我使用了这段代码 - 代码中的 cmets 解释了为什么这会如此混乱!:
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 时,由于更新后的列表模型添加到列表中就好了,后续操作(例如添加项目等)工作正常,直到我再次尝试删除项目!
感谢您提供帮助 - 如果您对如何解决此问题有任何想法,请务必发布!
问候
最大
【问题讨论】:
-
我知道,这是一个愚蠢的问题,但是,听起来所选项目在模型中不存在(或不能等同于
equal)一个值......去弄清楚如何会工作:P -
你能多做几件事吗?你能做到
CharListModel.contains(CharList.getSelectedItem())和/或CharListModel.indexOf(CharList.getSelectedItem())看看他们会返回什么 -
如需尽快获得更好的帮助,请发帖SSCCE。
-
@MadProgrammer - 在这两种情况下,我得到了一个在 getSelectedItem() 上找不到的方法。
-
请学习java命名约定并遵守它们。