Olá Guj!
E aí colegas, atualmente tenho tentado desenvolver um programinha para se posicionar imagens na tela. Estou utilizando ele no momento para melhor organização de criação de sprites sheets de jogos. Ele basicamente permite que o usuário insira uma imagem na tela e tenha a possibilidade de movimentar ela ou até de removê-la. As imagens são inseridas em um ArrayList desta forma:
public void adicionarSprite(Sprite sprite)
{
this.sprites.add(sprite);
}
E são removidas desta forma:
public void removerSprite(int index)
{
this.sprites.remove(index);
}
Algo bem básico, mas no começo, era funcional. O que acontece é que uso uma classe que extende de um JPanel e esta classe é uma Thread a qual irá demonstrar todos os sprites e permitir a manipulação dos mesmos quando o usuário quiser. Infelizmente, estou ganhando esta mensagem quando compilo o programa:
Exception in thread "Thread-2" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at entidades.PainelSpritesN.pintarSprSelecionado(PainelSpritesN.java:302)
at entidades.PainelSpritesN.atualizarGraficos(PainelSpritesN.java:171)
at entidades.NThread.run(NThread.java:78)
at java.lang.Thread.run(Unknown Source)
Sprite adicionado: Dinossauro
Sprite adicionado: Ave
E aqui está o metodo pintarSprSelecionado do qual ele acusa o erro na linha 302:
/**Pinta sprite selecionado com verde transparente para noção de trabalho.<br>
* <b>Condição: Implementado</b>*/
private void pintarSprSelecionado()
{
this.getGraficoTela().setColor(this.corSeletor);
this.getGraficoTela().fillRect(
this.sprites.get(this.indexSpriteSelecionado).getPosX() , <-------------------- LINHA 302
this.sprites.get(this.indexSpriteSelecionado).getPosY() ,
this.sprites.get(this.indexSpriteSelecionado).getLargura() ,
this.sprites.get(this.indexSpriteSelecionado).getAltura() );
}
Eu li na documentação da classe ArrayList: “Note that this implementation is not synchronized.”. Acredito que isso tenha algo nesse meio aí, mas sinceramente, eu não sei. Eu tentei fazer o que a documentação sugeriu:
this.sprites = new ArrayList(maxSprites);
List lista = (List) Collections.synchronizedList(this.sprites);
Mas não funcionou. Será que foi por eu não ter trabalhado com o objeto lista? Eu não sei bem. Eu fiz isso e depois fiz todos os algoritmos com o objeto sprites para atualização gráfica e lógica de tela. Esta mensagem que recebo ao compilar o programa aparece como se a lista estivesse vazia. O curioso é que vez ou outra que compilo o programa, ele funciona normal. Mas geralmente aparece essa mensagem e a tela fica preta. Só pode ter algo relacionado com Threads, não concorda? Estou meio perdido.
Quem puder me ajudar, ficarei grato.
Litium.