Dúvida de criar JButton dinâmicos

5 respostas
R

Estou com uma dúvida nos métodos selecionar(int indice) e colocarSites() eu queria que fosse criado dento do foreach varios botões dinamicamentes e a cada botão colocar uma ActionListener os botões são colocados na tela, mas o evento só é chamado o do ultimo botão criado como faço para criar vários eventos diferente um para cada botão criado dinamicamente.

package br.com.rcr.grafico;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;

import br.com.rcr.componentes.Site;
import br.com.rcr.conexao.DesktopConexao;
import br.com.rcr.gerenciador.Gerenciador;

public class PanelSites extends javax.swing.JPanel {

	private static final long serialVersionUID = 1L;


	 private URI teste;
	 private URI[] sites;
	 private JButton botao;

	 private int indicador;
	 
	public PanelSites() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setPreferredSize(new Dimension(700, 680));
			setBorder(BorderFactory.createTitledBorder("SITES"));
		    colocarSites();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//metodo colocarSites para gerar os botoes dinamicamente
	private void colocarSites(){
		List<Site> lista = 
			Gerenciador.todos(Site.class);
		   sites = new URI[lista.size()];
		   int i = 0;
		   
		for (Site site : lista) {	
		
			try {
				 teste = new URI(site.getEndereco());
			} catch (URISyntaxException e) {
				
				e.printStackTrace();
			} 
			
			sites[i] = teste;
			
			botao = new JButton(site.getNome());
	
			add(botao);
			i++;
			//chamar dinamicamente
			 selecionar(0);
		}
	}
    //metodo selecionar para selecionar um evento de acordo com o indice
	private void selecionar(int indice){
		 
		indicador = indice;
		
		botao.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
						 DesktopConexao.navegar(sites[indicador]);
		
				} catch (IOException e1) {
					
					e1.printStackTrace();
				}
				
			}
		});
		
	}

}

5 Respostas

V

O ActionListener é uma classe. Essa classe deverá receber o índice que deverá ser usado, e guardar esse índice em seu atributo. Assim vc terá um índice diferente por actionListener. Um exemplo similar pode ser visto aqui:
http://www.guj.com.br/java/140986-como-acionar-os-bots-de-uma-calculadora-atrav-do-teclado

R

Blz vo da uma olhada e ve se resolvo meu problema aqui vlw pela dica ai :wink:

R

Blz agora funcionou vlw, mas surgiu outra dúvida aqui porque agora aparece o botão com o nome do índice queria que aparecesse com o nome que eu queria segue abaixo o código

package br.com.rcr.grafico;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;

import br.com.rcr.componentes.Site;
import br.com.rcr.conexao.DesktopConexao;
import br.com.rcr.gerenciador.Gerenciador;

public class PanelSites extends javax.swing.JPanel {

	private static final long serialVersionUID = 1L;
	
	 private URI teste;
	 private URI[] sites;
	 private JButton botao;

	 private int indicador;
	 
	public PanelSites() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setPreferredSize(new Dimension(700, 680));
			setBorder(BorderFactory.createTitledBorder("SITES"));
		    colocarSites();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void colocarSites(){
		List<Site> lista = 
			Gerenciador.todos(Site.class);
		   sites = new URI[lista.size()];
		   int i = 0;
		   
		for (Site site : lista) {	
		
			try {
				 teste = new URI(site.getEndereco());
			} catch (URISyntaxException e) {
				
				e.printStackTrace();
			} 
			
			sites[i] = teste;
			
			BotaoNumericoAction numeric = new BotaoNumericoAction(i);
			//queria botar o nome que eu quiser no botão como pro exemplo b otao = new JButton(site.getNome());+ o
                        //comando numeric 
			botao = new JButton(numeric);
			
			add(botao);
			i++;
		}
	}
	//adicionei esta classe
	   private class BotaoNumericoAction extends AbstractAction  
	    {  
	    
			private static final long serialVersionUID = 1L;
			private int numero;  
	  
	        public BotaoNumericoAction(int numero)  
	        {  
	            super(Integer.toString(numero));  
	            this.numero = numero;  
	        }  
	  
	        @Override  
	        public void actionPerformed(ActionEvent e) {  
	            try {
					DesktopConexao.navegar(sites[numero]);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}  
	        }  
	    } 

}
V

Chame o método setText no seu botão.

R

Vlwwww me ajudo muito consegui o que queria aeeeee finalmente vlw msm vo po o tópico como resolvido vlw pela ajuda ai me ajudo pacas

Criado 5 de agosto de 2011
Ultima resposta 5 de ago. de 2011
Respostas 5
Participantes 2