Jump to content
grbabus

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

Recommended Posts

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

}

Edited by Baderous
geshi

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 "==".

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.