Dúvida com exception em interface (ConcurrentException)

Oi pessoal.
Estou fazendo um trabalho onde tenho um JFrame com um JPanel que tem vários quadrados cinzas, separados (tipo um tabuleiro de xadrez que não tem os campos “colados”). Tenho também os personagens do jogo e quero movimentar um deles com a tecla “Up” (a seta pra cima).

A primeira dúvida vem agora. Os campos onde os personagens são colocados são gerados aleatoriamente. Dessa forma, pode ser que um novo personagem caia no lugar onde já existe alguém. O tratamento deve ser feito na hora de inserir ou na hora em que a posição é gerada aleatória (a posição é gerada em outra classe, porque uma fica responsável só pelo “tabuleiro” e outra pelas entradas) ?

A segunda dúvida é a seguinte. Eu armazeno todos os personagens em um ArrayList de personagens. Dentro da classe Personagem tem dois atributos (x e y), que dizem onde os personagens estão. Supondo que a tecla “Up” foi pressionada. O personagem deve “ir para cima”. Porém, se eu simplesmente levar ele “para cima”, a imagem dele fica no campo onde ele estava. Dessa forma, eu faço o seguinte: se a tecla “Up” foi pressionada, eu, como tenho os personagens em um ArrayList, posso apagar todo o cenário (tabuleiro), e, para cada personagem, posso inserí-los dentro do cenário novamente. Porém, tenho uma exception enorme.

Eu geralmente costumo ler bem essas exceptions, para ver de onde vem o erro, mas essa eu não consegui.

O método de inserção dos personagens é esse:

[code]
public boolean inserirPersonagem(Personagem personagem, int x, int y)
{
//for (Personagem p : personagens) {
// if ((p.getX() == x) && (p.getY() == y)) {
// JOptionPane.showMessageDialog(null, "Impossível inserir o (a) personagem " + personagem.getNome() + “. Espaço já ocupado.”,
// “Mensagem de erro.”, JOptionPane.ERROR_MESSAGE);
// return false;
// }
//}

personagem.setPosicoes(x, y);
personagens.add(personagem);
visaoDoCenario.desenharPersonagem(x, y, personagem.getImagem());
return true;
}[/code]

Aquela parte está comentada porque se eu for inserir novamente (na hora que movimentou para cima) não vai inserir (obviamente). Mas eu espero que seja só tratar na hora em que os valores são gerados aleatoriamente.

O método de criar o cenário é esse:

public void criarCenario()
{        
    cenario = new Cenario(visaoDoCenario.getAltura(), visaoDoCenario.getLargura());
    
    visaoDoCenario.preparaPintura();
    
    for (int linha = 0; linha < cenario.getAltura(); linha++) {
        for (int coluna = 0; coluna < cenario.getLargura(); coluna++) {
            visaoDoCenario.desenharCenario(coluna, linha, Color.LIGHT_GRAY);
        }
    }
    
    visaoDoCenario.repaint();
}

E o método que é responsável pelo fluxo de execução (ou seja, que é chamado quando aperto a tecla para cima):

public void redesenharPersonagens()
{
    criarCenario();
    for (Personagem p : personagens) {
        inserirPersonagem(p, p.getX(), p.getY());
    }
}

Acho que é só. Venho ao pessoal do GUJ porque não sei mesmo o que pode estar acontecendo. Estou achando que vai ficar muito caro, pois a cada movimento, o cenário é repintado (existirão diversos outros personagens, se movimentando também (só que estes serão movidos sozinhos)). Basicamente, eu tenho que fugir deles :slight_smile:

Será que é necessário Thread?

Abraço.

[editado]
Oi pessoal.
Então… dei uma procurada naquela exception e falaram para usar Iterator. Eu estou usando, porém continua o mesmo erro.
O código agora está assim:

public void redesenharPersonagens()
{
    criarCenario();
    Iterator<Personagem> iterator = personagens.iterator();
    Personagem aux = null;
    
    while (iterator.hasNext()) {
        aux = iterator.next();
        inserirPersonagem(aux, aux.getX(), aux.getY());
}

Bom, falaram também para usar outra Collection, mas eu acho que fica meio gambi. Então gostaria de continuar tentando com o Iterator.

[/editado]

Oi pessoal.
Desculpa re-upar o tópico, mas só consegui fazer com duas Collections e sem o Iterator. Alguém já conseguiu fazer com o Iterator?

A primeira pergunta continua (da coesão entre as classes, se é melhor tratar o aleatório antes de inserir no cenário ou depois).

public void redesenharPersonagens()
{
    criarCenario();
    for (Personagem p : personagens) {
        inserirPersonagem(p, p.getX(), p.getY());
    }
}

Você está ao mesmo tempo percorrendo a lista de personagens e tentando inserir elementos nela?

thingol,

Pois é. Notei que fiz isso, mas já era de madrugada. Aí coloquei o Iterator, mas continuou com a Exception (vou dar uma olhada melhor).
Usando outra lista consegui fazer, mas não gostei muito porque parece caca.