0

arrayList をリストする JList があります。削除というボタンを押すと、選択した要素をリスト (理想的には配列リスト) から削除します。現時点では、次のコードがありますが、機能していません。つまり、要素が選択されている場合は何もしないように見え、何も選択されていない場合は ArrayIndexOutOfBoundsException が返されます。

private JList listOrders = new JList(arrayList.toArray());

public void myList() {
    listOrders.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION );
    panelForLists.add(listOrders);
}

public void updateList() {
    listOrders.setListData(arrayList.toArray());
    listOrders.revalidate();
    listOrders.repaint();
}

public void actionPerformed(ActionEvent event) {
    if (event.getSource() == deleteItem) {
         int index = listOrders.getSelectedIndex();
            listOrders.remove(index);
           updateList();
    }
}

おそらくどこかに ListSelectionListener を追加する必要があるためだと思いますが、これをどのように処理できるかわかりません。私は何年にもわたってインターネットで答えを探してきましたが、これは JList oracle demo から思いついたものです。

どうもありがとう!

4

4 に答える 4

4

updateList()リストからアイテムを削除し、呼び出したときにこのメソッドがsetListData(...)JListを呼び出すと、アイテムを再び追加しているように見えます。私はあなたがその方法を取り除くべきだと思います。ListModelはデータを保持する必要があり、データを変更した後にJListrevalidate()を呼び出す必要はありません。repaint()

于 2012-04-30T21:47:59.610 に答える
3

これは基本的に Hovercraft Full Of Eels がすでに回答したものですが、さらにコード ポインターが追加されています。

  1. 実際に要素を削除して再度追加しますが、もちろん効果はありません。最も簡単なのはArrayListas を直接使用できる場合ですListModelが、これは不可能です ( はArrayListイベントを発生させないため)。JList( Vector )代わりにコンストラクターを使用したくなるかもしれませんが、コンストラクターは後でベクターを変更することを許可していません。そのため、独自の を作成することに行き詰まっていますListModel。クラスはおそらくあなたDefaultListModelが探しているものです。
  2. メソッド内のコードactionPerformedは、要素が選択されていることを常に前提としています。getSelectedIndex何も選択されていない場合、このメソッドは -1 を返すことに注意してください。(ユーザーにとって)できる最善のことは、何も選択されていないとき、または複数の要素が選択されているときに削除ボタンを無効にすることです。これは、ボタンの背後にあるアクションにリストの選択モデルをリッスンさせ、選択に応じてその有効状態を更新させることで実現できます (必要に応じて a を起動することを忘れないでくださいPropertyChangeEvent)。Actionボタンのバックアップを使用しない場合は、選択に基づいてボタンの有効状態を直接切り替えるだけです。
于 2012-04-30T22:00:31.910 に答える
2

ListModelを使用して、選択した要素を削除する必要があります。

int index = listOrders.getSelectedIndex();
ListModel model = listOrders.getModel();

JListを呼び出すときに、javax.swing.AbstractListModelを使用してモデルをビルドしますsetListData

ListModel独自のextendsforputCRUDjavax.swing.AbstractListModelメソッドを実装する必要があります。

于 2012-04-30T21:49:32.980 に答える
1

適切に更新するモデルを作成できます

class ArrayListModel<T> extends AbstractListModel{

    private final List<T> arr = new ArrayList<T>();
    public int getSize(){
        return arr.size();
    }

    public T getElementAt(int ind){
        return arr.get(ind);
    }

    public void remove(int ind){
        arr.remove();
        fireIntevalRemoved(this,ind,ind);
    }


    public void add(T obj){
        arr.add(obj);
        fireIntevalAdded(this,arr.size(),arr.size());
    }

    public void setData(List<T> list){
        int size=arr.size();
        arr.clear();
        arr.addAll(list);
        fireIntevalChanged(this,0,arr.size()>size?arr.size():size);
    }

}

setModelでリストのモデルを設定します

于 2012-04-30T21:56:58.310 に答える