Problema ao adicionar ActionListener

9 respostas
F

Então pessoal. O problema é o seguinte estou criando um gerenciador de Albuns e estou numa parte a qual nao consigo resolver. Assim o usuário seleciona uma imagem atráves do filechooser. E depois que ele seleciona a imagem. Eu pego o nome da imagem e atribuo a uma Lista de JMenuItem. Ou seja cada vez que ele pegar uma imagem , o nome da Imagem vai sendo colocado um embaixo do outro co0mo JMenusItens dentro de um JMenu. Até ai está fazendo porém eu preciso criar uma action para esse JMenuItens, na maneira de que se o usuário clicar no primeiro JMenuItem , ele irá abrir uma outra tela contendo a imagem correspondente. Porém estou meio perdido. Segue meu código para resolução . Desde ja agradeçio, preciso da resposta o mais breve possível.

package g4.albumDigital.igu;

import g4.albumDigital.logica.*;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class TelaImagens extends JDialog implements ActionListener {

	private static final long serialVersionUID = 4409915301083042110L;

	JMenu menuOpções, menuTodasFotos;
	JMenuBar jMenuBar;
	JMenuItem itemInserir,itemDeletar;
	JFileChooser chooser;
	Album album;

	public TelaImagens(Album a) {
		setTitle(a.getTitulo());
		this.album = a;
		chooser = new JFileChooser();
		setAparencia();
	}

	public void mostreJanela() {
		setVisible(true);
		setLocationRelativeTo(null);
		
		
	}
	
	public void setAparencia(){
		jMenuBar = new JMenuBar();
		setJMenuBar(jMenuBar);
		setSize(480, 300);
		//getContentPane().setBackground(Color.black);
		menuOpções = new JMenu("Imagens");
		jMenuBar.add(menuOpções);
		itemInserir = new JMenuItem("Inserir");
		itemInserir.setActionCommand(Opcao.INSERIR_IMAGEM.name());
		menuOpções.add(itemInserir);
		itemInserir.addActionListener(this);
		itemDeletar= new JMenuItem("Deletar");
		itemDeletar.setActionCommand(Opcao.DELETAR_IMAGEM.name());
		menuOpções.add(itemDeletar);
		itemDeletar.addActionListener(this);
		menuTodasFotos= new JMenu("Fotos do Álbum");
		jMenuBar.add(menuTodasFotos);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		Opcao opcao = Opcao.valueOf((e.getActionCommand()));
		ArrayList<JMenuItem> itensFotos = new ArrayList<JMenuItem>();
		File file = null;
		try {
			switch (opcao) {
			case INSERIR_IMAGEM:
				
					chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
					int res = chooser.showOpenDialog(null);
					if (res == JFileChooser.APPROVE_OPTION) {
						file = chooser.getSelectedFile();
						JOptionPane.showMessageDialog(null,
								"Arquivo escolhido com sucesso");
						
					//Cria um MenuItem com o nome da Foto e adicona ao Array
							itensFotos.add(new JMenuItem(file.getName()));
							

						
						String local = JOptionPane.showInputDialog(null,
							"Aonde foi o local desta foto?");
					String pessoa = JOptionPane.showInputDialog(null,
							"Com quem você(s) estava(m)?");
					String evento = JOptionPane.showInputDialog(null,
							"O que você(s) faziam lá?");
					
					Imagem foto = new Imagem( local, pessoa, evento, file);
					album.salvarImagem(foto);
						for (JMenuItem jMenuItem : itensFotos) {
							menuTodasFotos.add(jMenuItem);
							jMenuItem.addActionListener(this);
     // Não sei se está certo isso.
     //Estou na dúvida por aqui, estou Adicionando um actionListener para cada MenuItem, mas estou confuso como criar essa action para abrir 
//respectivamente cada imagem correspondente ao item do Menu, e também dentro dessa Action para abrir a imagem certa.
							 
							
						}
					
				
				}
				break;

			case DELETAR_IMAGEM:
			
				
				
				
				
				break;
				

			}
		} catch (Exception e2) {
			JOptionPane.showMessageDialog(null,
					"Ocorreu um erro durante o processamento");
		}

	}
	

	
}

Ou seja o problema é o seguinte criar um Action genérica que será chamada quando for clicado em qualquer um desses Itens de Menu que tem como nome , o nome da Imagem, e ao ser clicada qualquer item do Menu, chamar uma outra tela que terá a imagem correspondente á clicada. Segue imagem de exemplo.

[img]

http://img51.imageshack.us/img51/9586/imagensp.png

[/img]

9 Respostas

M

Alguem aqui ta recebendo algo pra te ajudar ?? se quizer passo para
você o numero da minha conta… deposita que te mando a soluçao do
seu problema !!

F

Meu filho, só deixei ali que precisaria da resposta o mais breve possível isso não significa que ninguem precisa responde. Agora você que ao invés de ajudar quer dar uma de bonzão e se aparecer? Faz um favor nao precisa nem comentar , senão quer ajudar fica bem caladinho.

M

não vou discutir com você não… mas pode ter certeza que não vou te ajudar…rsrsrsrsrs

F

que bom

discorpio

Boa tarde Fellipe1

Acho que entendi o seu problema.

Bom, pra começar, você além de incluir os JMenuItens com os seus respetivos nomes, também pode incluir as fotos como ícones, assim:

String local = JOptionPane.showInputDialog(null, "Aonde foi o local desta foto?");  
String pessoa = JOptionPane.showInputDialog(null, "Com quem você(s) estava(m)?");  
String evento = JOptionPane.showInputDialog(null, "O que você(s) faziam lá?");

Imagem foto = new Imagem( local, pessoa, evento, file);    

//Cria um MenuItem com o nome da Foto e adicona ao Array
JMenuItem item = new JMenuItem(file.getName());
//Adiciona a foto no MenuItem
item.setIcon(new ImageIcon(foto));
itensFotos.add(item);

Quanto aos ActionListeners, vejo que você está criando ActionListeners dentro de um outro ActionListners, como você está utilizando um loop for, então melhor é criar estes ActionListeners como classes anônimas, assim:

for (JMenuItem jMenuItem : itensFotos) {  
      menuTodasFotos.add(jMenuItem);  
      jMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                 File imagefile = new File(jMenuItem.getText());

                 /* Agora aqui você direciona o arquivo da foto imagefile
                     para onde quiser, ou se preferir criar uma nova imagem
                     com a classe ImageIcon, também pode. */

                 Image img = newImageIcon(jMenuItem.getText());
                 
            }
        });  
}

Bom, acho que isto resolve

F

valeu pela ajuda cara, vou testar aqui sua solução e em breve posto aqui se funcionou, estava com bastante duvida nessa parte mas você soube explicar bem, valeu.

F

então testei com a sua sugestão, até um ponto deu certo, se clica num itemDeMenu que corresponde a imagem ele abre, porém se existem mais de 2 arquivos nessa lista de menusItem, quando eu clico em cima de qualquer um deles, ele sempre está abrindo o último arquivo e não o correspondente. Imaginei em fazer essa verificação com MouseEvent mas não sei muito bem como fazer isso, alguem teria sugestões?

discorpio

Boa noite Fellipe1

Rapaz, me desculpe pois eu esqueci de um detalhe, a referência do JMenuItem clicado.

O que está acontecendo é que você está criando o ActionListener depois de ter armazenado o JMenuItem no ArrayList, e isto deve ser feito antes de você colocá-lo no ArrayList, pois se não, você sempre adicionará o evento ActionListener sempre no último JMenuItem da lista, dentro do loop for.

Sendo assim, você não precisará criar o ArrayList de JMenuItem, só para adicioná-lo ao JMenu, basta fazer isto direto, assim:

String local = JOptionPane.showInputDialog(null, "Aonde foi o local desta foto?");    
String pessoa = JOptionPane.showInputDialog(null, "Com quem você(s) estava(m)?");    
String evento = JOptionPane.showInputDialog(null, "O que você(s) faziam lá?");  
  
Imagem foto = new Imagem( local, pessoa, evento, file);      
  
//Cria um MenuItem com o nome da Foto e adicona ao Array  
JMenuItem item = new JMenuItem(file.getName());  
//Adiciona a foto no MenuItem  
item.setIcon(new ImageIcon(foto));
// O evento ActionListener tem que ser criado aqui:
item.addActionListener(new ActionListener() {  
            @Override  
            public void actionPerformed(ActionEvent e) {  
                 File imagefile = new File(item.getText());  
  
                 /* Agora aqui você direciona o arquivo da foto imagefile 
                     para onde quiser, ou se preferir criar uma nova imagem 
                     com a classe ImageIcon, também pode. */  
  
                 Image img = newImageIcon(item.getText());  
                   
            }  
});
// Adiciona o JMenuItem direto no JMenu, sem precisar de ArrayList    
menuTodasFotos.add(item);

Assim sendo, o Loop for não será mais necessário, eis que o JMenu ele já cria uma lista interna de JMenuItem, bastando tão somente você criar cada JMenuItem individual e criar também o seu ActionListener Individual, onde você pode identificá-lo com o seu nome, o até com o método getActionCommand.

Um abraço.

ViniGodoy

Olá.

O Marcelo Rebello estava certo. Por favor, não peça urgência em suas mensagens. É considerado falta de educação.

Enfim. Lembre-se que listeners podem ser implementados como classes. Portanto, podem ter campos e receber parâmetros.

public class ImagemListener implements ActionListener
{
    //Note que o listener pode armazenar que foto deve abrir
    private Imagem foto;
    public ImagemListener(Imagem foto) {
        this.foto = foto;
    }

    public void actionPerformed(ActionEvent e) {    
        //Aqui vc abre a outra janela que exibe a foto
    }    
}
E na hora de criar um menu item:
Imagem foto = new Imagem( local, pessoa, evento, file);  
JMenuItem item = new JMenuItem(file.getName());  
//Note que a foto está sendo passada como parâmetro para o listener
item.addActionListener(new ImagemListener(foto));
Criado 20 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 9
Participantes 4