Попытка удалить элементы Jlist

Я пытаюсь удалить элементы из Jlist в режиме реального времени, но я всегда получаю постоянное сообщение об ошибке, элементы списка состоят из имен пользователей, которые должны быть удалены, когда сервер отправляет определенное сообщение.

package com.yorkrider;

import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class A_Chat_Client implements Runnable
{
    // globals
    Socket SOCK;
    Scanner INPUT;
    Scanner SEND = new Scanner(System.in);
    PrintWriter OUT;
    ArrayList<String> Users = new ArrayList<String>();
    // -----------------------------------------------------------------------------------
    public A_Chat_Client(Socket X)
    {
        this.SOCK = X;
    }
    // -----------------------------------------------------------------------------------
    public void run()
    {
        try
        {
            try
            {
                INPUT = new Scanner(SOCK.getInputStream());
                OUT = new PrintWriter(SOCK.getOutputStream());
                OUT.flush();
                CheckStream();
            }
            finally
            {
                SOCK.close();
            }
        }
        catch(Exception X) { System.out.print(X); }
    }
// ---------------------------------------------------------------------------------

    public void DISCONNECT() throws IOException
    {
        OUT.println(A_Chat_Client_GUI.UserName + " has disconnected");
        OUT.flush();
        Remove_User(A_Chat_Client_GUI.UserName, SOCK);
        //SOCK.close();
        JOptionPane.showMessageDialog(null, "You Disconnected");

        //Users.removeAll();
        //System.exit(0);
    }
    // ---------------------------------------------------------------------------------
    public void CheckStream()
    {
        while(true)
        {
            RECEIVE();
            //A_Chat_Client_GUI.JL_ONLINE.setListData(Users)
        }
    }
    // ---------------------------------------------------------------------------------
    public void RECEIVE()
    {
        if(INPUT.hasNext())
        {
            String MESSAGE = INPUT.nextLine();

            if(MESSAGE.contains("#?!"))
            {
                String TEMP1 = MESSAGE.substring(3);
                TEMP1 = TEMP1.replace("[","");
                TEMP1 = TEMP1.replace("]", "");

                String[] CurrentUsers = TEMP1.split(", ");
                A_Chat_Client_GUI.JL_ONLINE.setListData(CurrentUsers);
                //Users.add(TEMP1);

                A_Chat_Client_GUI.TA_CONVERSATION.append(A_Chat_Server.CurrentUsers.get(
                        A_Chat_Server.CurrentUsers.size()-1) +" has joined on IP address "+
                        A_Chat_Client_GUI.HostIP+" and port number "+A_Chat_Client_GUI.PortNumber +"\n");
                A_Chat_Client_GUI.JL_ONLINE.removeAll();
                System.out.println(Users);

            }
//----------------The problem is here-------------------------
            else if(MESSAGE.contains("@!@")) {
                String TEMP1 = MESSAGE.substring(3);
                TEMP1 = TEMP1.replace("[", "");
                TEMP1 = TEMP1.replace("]", "");
                for(int j=0; j < A_Chat_Client_GUI.JL_ONLINE.getModel().getSize(); j++){
                    if (TEMP1.equals(A_Chat_Client_GUI.JL_ONLINE.getModel().getElementAt(j))){
                        A_Chat_Client_GUI.JL_ONLINE.getModel().remove(j);
                    }
                }
            }
//--------------------The problem is here------------------------
            else
            {
                A_Chat_Client_GUI.TA_CONVERSATION.append(MESSAGE + "\n");
            }
        }
    }
// ---------------------------------------------------------------------------------

    public void SEND(String X)
    {
        OUT.println(A_Chat_Client_GUI.UserName + ": " + X);
        OUT.flush();
        A_Chat_Client_GUI.TF_Message.setText("");
    }
// ---------------------------------------------------------------------------------
  
    public static void Remove_User(String UserName, Socket SOCK) throws IOException
    {
        Socket TEMP_SOCK = SOCK;
        PrintWriter OUT = new PrintWriter(TEMP_SOCK.getOutputStream());
        OUT.println("@!@" + UserName);
        System.out.println(UserName);
        OUT.flush();
    }
   
}

Это сообщение об ошибке, которое является постоянным сообщением об ошибке:

java.lang.ArrayIndexOutOfBoundsException: индекс массива вне диапазона: 0


person Gustavo Varollo    schedule 30.03.2021    source источник
comment
1) Имена переменных не должны быть написаны с заглавной буквы. 2) Имена переменных не должны содержать _. Изучите и следуйте соглашениям Java. Любой учебник или учебник, который вы прочитаете, будет соответствовать стандартам. 3) Почему вы пытаетесь удалить j + 1, когда вы проверяете условие на j? 4) опубликуйте правильный минимально воспроизводимый пример, демонстрирующий проблему после устранения вышеуказанных проблем.   -  person camickr    schedule 30.03.2021
comment
(1-) Исправление одного утверждения не помогает. Мы до сих пор не знаем, какое утверждение вызывает проблему. Мы понятия не имеем, каково значение переменной сообщения. Мы понятия не имеем, каково значение temp1. Мы понятия не имеем, какие данные содержатся в вашем JList. Скорее всего, когда вы создадите свой MRE, вы обнаружите проблему, потому что ваша проблема может показаться простой опечаткой.   -  person camickr    schedule 30.03.2021
comment
Проверьте: stackoverflow.com/questions/38227729/ для простого примера MRE. Он показывает, как жестко кодировать данные в JList. Затем вы замените кнопку удаления своим текстовым полем, чтобы вы могли удалить элемент, который вводит пользователь. Как только вы это заработаете, вы поймете, в чем разница между простым кодом и вашим реальным кодом.   -  person camickr    schedule 30.03.2021


Ответы (1)


Я не могу понять ваш код без реализации ваших классов, но, возможно, вам нужно:

A_Chat_Client_GUI.JL_ONLINE.getModel().remove(j);

вместо:

A_Chat_Client_GUI.JL_ONLINE.remove(j);

Цикл for должен начинаться с последнего индекса:

for (int j = A_Chat_Client_GUI.JL_ONLINE.getModel().getSize() - 1; j >= 0; j--) {
    if (TEMP1.equals(A_Chat_Client_GUI.JL_ONLINE.getModel().getElementAt(j))) {
        A_Chat_Client_GUI.JL_ONLINE.getModel().remove(j);
    }
}

Таким образом, несканированные индексы остаются на том же месте (сохраняют тот же индекс j) после любого удаления.

person Stéphane Millien    schedule 30.03.2021
comment
Я отредактировал полную реализацию, а также попробовал это решение, но оно просто возвращает еще одну ошибку. - person Gustavo Varollo; 31.03.2021