簡體   English   中英

ArrayIndexOutOfBoundsException與JList中的ActionListener

[英]ArrayIndexOutOfBoundsException with ActionListener in JList

我查看了其他與我的問題有關的問題,但這些問題沒有“解決”我的問題。 我收到ArrayIndexOutOfBoundsException,並且我正在處理的代碼正在刪除名為contactList的JList中的“ contact”。

我實現了一個按鈕,該按鈕將簡單地刪除contactList中的“聯系人”。 程序應該做的是,如果按鈕刪除“廣播”(contactList中的第一個元素),它將通過輸出顯示消息返回錯誤。 否則,應該簡單地從聯系人列表中刪除該聯系人。

我現在遇到的問題是,刪除聯系人時會產生arrayIndexOutOfBoundsException。 不僅如此,它還會從另一個if語句中打印出錯誤行。 刪除廣播會輸出錯誤消息,但仍顯示arraryIndexOutOfBoundsException。

另外,我不確定我是否正確執行了第一條if語句。 我在開始時就包含了必要的代碼,以及在測試代碼后得到的錯誤。

private JList<String> listContacts;
listContacts = new JList<String>(controller.getContacts());
// gets contact list from controller class which gets contact list from client class.
private JButton btDeleteUser;

JButton deleteUser = new JButton("Delete User");

deleteUser.addActionListener(new MyButtonListener5());

class MyButtonListener5 implements ActionListener{
    public void actionPerformed(ActionEvent e){
        DefaultListModel<String> list = (DefaultListModel)(listContacts.getModel());
        String contact = listContacts.getSelectedValue();
        int j = -1;
        for(int i = list.getSize()-1; i >= 0; i--){
            if(list.getElementAt(i).equals("Broadcast")){
                controller.displayMsg("[ERROR] You cannot delete broadcast\n");
            }
            else if(list.getElementAt(i).equals(contact) && i != j){
                j = i;
            }
        }
        if(j != -1){
            (DefaultListModel)list.remove(j);
        }
    }
}

[java] Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JList$4 cannot be cast to javax.swing.DefaultListModel
 [java]     at edu.ucsb.cs56.projects.networking.chat.chatclient.view.ClientWindow$MyButtonListener5.actionPerformed(ClientWindow.java:391)
 [java]     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
 [java]     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
 [java]     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
 [java]     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
 [java]     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
 [java]     at java.awt.Component.processMouseEvent(Component.java:6535)
 [java]     at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
 [java]     at java.awt.Component.processEvent(Component.java:6300)
 [java]     at java.awt.Container.processEvent(Container.java:2236)
 [java]     at java.awt.Component.dispatchEventImpl(Component.java:4891)
 [java]     at java.awt.Container.dispatchEventImpl(Container.java:2294)
 [java]     at java.awt.Component.dispatchEvent(Component.java:4713)
 [java]     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
 [java]     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
 [java]     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
 [java]     at java.awt.Container.dispatchEventImpl(Container.java:2280)
 [java]     at java.awt.Window.dispatchEventImpl(Window.java:2750)
 [java]     at java.awt.Component.dispatchEvent(Component.java:4713)
 [java]     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
 [java]     at java.awt.EventQueue.access$500(EventQueue.java:97)
 [java]     at java.awt.EventQueue$3.run(EventQueue.java:709)
 [java]     at java.awt.EventQueue$3.run(EventQueue.java:703)
 [java]     at java.security.AccessController.doPrivileged(Native Method)
 [java]     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
 [java]     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
 [java]     at java.awt.EventQueue$4.run(EventQueue.java:731)
 [java]     at java.awt.EventQueue$4.run(EventQueue.java:729)
 [java]     at java.security.AccessController.doPrivileged(Native Method)
 [java]     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
 [java]     at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
 [java]     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
 [java]     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
 [java]     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
 [java]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
 [java]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
 [java]     at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

基本:

如果JList中有5個元素,則最后一個元素的索引為4,列表的大小為5。

問題:

 for(int i = 0; i <= list.getSize(); i++){

在這里,您說要從0到包含端值的范圍(包括端值)循環,因此當i到達列表的長度時,您將嘗試獲取具有相同索引的元素,但不存在。

您需要將<=更改為<

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM