5

からのデータを含む単純な Jlist を取得しList<String>ました。選択した項目を Jlist から削除したいと考えています。コードは次のとおりです。

final DefaultListModel<String> model = new DefaultListModel();
final JList list = new JList(model);

//filling list
//loop for every element from List<String>
 public static void sample(DefaultListModel model, List<String> data)
      for(int i=;i<data.size();i++)
        {model.addElement(data.get(i));}

//btn pressed
public void actionPerformed(ActionEvent arg0) {
    int index = list.getSelectedIndex();
    model.removeElementAt(index);
}

次のエラーが表示されます。

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.removeIndexInterval(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(Unknown Source)
at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source)
at javax.swing.DefaultListModel.remove(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

何かトリックか何かですか?手伝ってくれてありがとう。

4

6 に答える 6

6

インデックスが(他の人が述べているように)負ではないと仮定して、これが(リスナーで)機能するかどうかを確認します。

((DefaultListModel) jList.getModel()).remove(index);

もしそうなら、あなたは古いモデルを使用しています。

于 2012-11-08T22:42:01.043 に答える
3

javadocによると、remove()代わりに使用することをremoveElementAt()お勧めします。

public void actionPerformed(ActionEvent arg0) {
    int index = list.getSelectedIndex();
    if (index != -1) {
        model.remove(index);
}
于 2012-11-08T22:43:47.733 に答える
2

JavadocによるとgetSelectedIndex()

選択された最小のセルインデックスを返します。リストで1つのアイテムのみが選択されている場合の選択。複数のアイテムが選択されている場合、それは単に選択された最小のインデックスです。選択がない場合は-1を返します

エラーが発生している理由は、何らかの理由でリストからアイテムが選択されていないため、このメソッドによって-1が返されるためです。呼び出しremoveElementAt()てパラメータ値として-1を渡すと、例外がスローされます。

あなたがする必要があることは次の通りです:

public void actionPerformed(ActionEvent arg0) {
    int index = list.getSelectedIndex();
    if(index >= 0){ //Remove only if a particular item is selected
        model.removeElementAt(index);
    }
}
于 2012-11-08T22:23:56.230 に答える
1

問題は、要素が削除されると選択された値が変更されるため、リスナーに問題があるということです。これが、「valueChanged」メソッドが selectedValue を間違った位置に取得しようとしている理由です。メソッドの valueChanged が表示されませんが、これが理由だと思います。

于 2014-11-11T14:18:18.517 に答える