Ir para o conteúdo
grbabus

[Resolvido] erro ArrayList : Array index out of range: 1

Mensagens Recomendadas

grbabus

bom dia JavaManíacos

estou com um problema de arrancar os cabelos (não que os tenha muito), tenho um projecto que e um JFrame com um JLabel com uma imagem de fundo onde vou adicionando JPanel a esse label num ArrayList<JPanel> até ai tudo bem só o que quero e quando faço double click a esses JPanels que estão no ArrayList troque a imagem de fundo deles a escolha o erro que está acontecendo e que so troca a imagem do 1º JPanel o 2º,3º etc dão esse erro Array index out of range: bom vou colocar aqui uma imagem do JFrame com dois JPanels o 1º consegui trocar a imagem como vão ver : logo a baixo vai o código (está meio esparguete que já fiz vários teste) segue:pro_zps09a433c1.jpg

o Código: da Classe que insere os JPanels:

private void jLImageMouseClicked(java.awt.event.MouseEvent evt) {									
 area = new JPanel(); //Panel inicial
 JPanel tpanel = new JPanel(null);//panel para Imagem
 resizer = new Resizable( area); //Classe Para Jpanel resizer

 resizer.setBounds(100, 200, 200, 150);// Posição inicial

tpanel.setName("im"+String.valueOf(lpImage.size()-1));// Nome o panel de imagem baseado no sizer do ArrayList<Jpanel>

 tpanel.setBackground(Color.yellow); // cor para o Jpanel

 resizer.add(tpanel);// Adicionando o JPanel a o Componet

 area.setFocusable(true);

 lpImage.add(resizer);// Adicionando o Componente ao ArrayList<JPanel>

 lpImage.get(lpImage.size()-1).isOptimizedDrawingEnabled();


 background.add(lpImage.get(lpImage.size()-1),BorderLayout.CENTER);//Adicionado o ultimo ArrayList<JPanel> a Imagem de Fundo do JFrame


 lpImage.get(lpImage.size()-1).setFocusable(true);

 lpImage.get(lpImage.size()-1).setRequestFocusEnabled(true);


 lpImage.get(lpImage.size()-1).grabFocus();

 String nome = String.valueOf( lpImage.size()-1);// prga o Ultimo valor do ArrayList<JPanel>

 lpImage.get(lpImage.size()-1).setName("im"+nome ); // Muda o nome


	 //eventos do mouse

	 lpImage.get(lpImage.size()-1).addMouseListener(new MouseListener() {

	 @Override
	 public void mouseClicked(MouseEvent e) {


		 if (e.getClickCount() == 2 && !e.isConsumed()) { // quando se a double click no JPanel para ecolher a imagem
			 e.consume();

			 Resizable label = (Resizable)e.getSource();

			 String filename = File.separator+"tmp";
			 JFileChooser fc = new JFileChooser(new File(filename)); // escolhendo a Imagem
				 fc.addChoosableFileFilter(new FiltroImagens());


			 fc.showOpenDialog(label);
			 File selFile = fc.getSelectedFile();
				 resizer.setCaminhoImage(selFile.getAbsolutePath());
				 resizer.setNome(label.getName());
				 lpImage=	 resizer.setImage(label.getName(), lpImage);// este metodo que á erro já (envio para la o nome e o ArrayList<JPanel>)
 //e depois de fazer as alterações ele me devolve ArrayList<JPanel>



		 }




	 }
 });



 background.repaint();

}

Código o método de alteração de imagem

public ArrayList<Resizable> setImage(String tNome,ArrayList<Resizable> lTemp){

 JPanel panel = new JPanel();// crio um panel temporario
 BufferedImage img= Utilidades.scaleImage(this.getWidth(),this.getHeight(),caminhoImage); //esse metodo estático redimenciona a imagem para o tamanho desejado
 jImage=new JLabel(new ImageIcon((Image)img));//adiciona a imagem ao Jlabel
 panel.add(jImage);//adiciona a imagem ao Jpanel Temporario
	 int a= 0;// para contagem dos itens no ArrayList<JPanel>

	 for (Resizable temp:lTemp){// for earch do ArrayList<JPanel>

		 if(temp.getNome()==tNome)// se o nome for igal ao passado remove o item do ArrayList<JPanel> e adiciona o JPanel Temporario
		 {
			 temp.remove(a);// aqui que da o erro so funciona no ArrayList<JPanel> na posição 0( 1º)
			 temp.add( panel);
			 break;
			 }
			 a+=1;

		 }




	 return lTemp;// retorna

}

Editado por Baderous
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

apresenta todo o output da mensagem da excepção e (de preferência) aponta qual a linha que está a originar o erro


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
grbabus

Seria

apresenta todo o output da mensagem da excepção e (de preferência) aponta qual a linha que está a originar o erro

Seria isso:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1

at java.awt.Container.remove(Container.java:1195)

at CL.Resizable.setImage(Resizable.java:230) ( o erro a na hora de remover o item se for maior que 0: temp.remove(a);// aqui que da o erro so funciona no ArrayList<JPanel> na posição 0( 1º) ) no segundo método que coloquei.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Esse código de iteração/remoção não tem muito sentido, porque é que estás a remover elementos com um índice que ainda por cima nem é controlado pelo valor dos elementos da lista? E sinceramente, as regras de português incluem acentos e pontuação, é impossível perceber a descrição do que queres fazer.

A excepção é óbvia, estas a tentar remover um elemento com um índice que não existe dentro da lista, ou porque a lista está vazia ou porque a lista tem menos elementos do que o índice que estás a passar, só não percebo é o que é que pretendes fazer com o ciclo e com o código de remoção.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
grbabus

Esse código de iteração/remoção não tem muito sentido, porque é que estás a remover elementos com um índice que ainda por cima nem é controlado pelo valor dos elementos da lista? E sinceramente, as regras de português incluem acentos e pontuação, é impossível perceber a descrição do que queres fazer.

A excepção é óbvia, estas a tentar remover um elemento com um índice que não existe dentro da lista, ou porque a lista está vazia ou porque a lista tem menos elementos do que o índice que estás a passar, só não percebo é o que é que pretendes fazer com o ciclo e com o código de remoção.

Boas

desculpe os erros de português andei a digitar a pressa( mas não e o caso de fazer isso ) se não percebeu e realmente quer ajudar pergunte o que não entendeu, como eu disse o erro parece ser claro mas os itens estão lá mas só remove o 1º.

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
// ...

Iterator<Resizable> iter = lTemp.iterator();
while (iter.hasNext()) {
 Resizable temp = iter.next();
 if (temp.getNome() == tNome) {
   lTemp.remove(temp);
   return lTemp;
 }
}

// ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
grbabus

// ...

Iterator<Resizable> iter = lTemp.iterator();
while (iter.hasNext()) {
 Resizable temp = iter.next();
 if (temp.getNome() == tNome) {
lTemp.remove(temp);
return lTemp;
 }
}

// ...

Obrigado vou testar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

// ...

Iterator<Resizable> iter = lTemp.iterator();
while (iter.hasNext()) {
 Resizable temp = iter.next();
 if (temp.getNome() == tNome) {
lTemp.remove(temp);
return lTemp;
 }
}

// ...

Por isso é que pedi que explicasses melhor, porque este exemplo faz coisas diferentes do que tinhas no código. Deixo duas sugestões, em vez de usar Iterator passar a usar fast enumeration ou "foreach", e a comparação de Strings (e outros objectos) é feita com o método equals não com o operador de comparação "==".

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

a comparação de Strings (e outros objectos) é feita com o método equals não com o operador de comparação "==".

copy-paste ... nem vi o que estava a ser comparado ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.