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
。更新されたリスト モデルは問題なくリストに追加され、アイテムの追加などの後続のアクションは正常に機能するため、アイテムをもう一度削除しようとするまで問題ありません。
ご協力いただきありがとうございます。また、この問題を解決する方法について何かアイデアがあれば、ぜひ投稿してください。
よろしく
マックス