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 に答える
0

私は同じ問題を抱えています、私はこれを修正します:

ボタンアクション

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

と。

listValueChanged

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