Applet Problema com JButton e MouseListener [Resolvido]

8 respostas
Mannes

Blz, galera?
Estou fazendo um applet, que implementa mouseListenner
Tenho um botão que quando clicado faz um "post" em uma URL, porém, quando clico pela segunda vez no botão ele executa o metodo adicionar() 2 vezes, e duplica o registro, na terceira vez ele triplica, e assim vai...
Aqui uns trechos de códigos para vcs entenderem melhor...

//imports necessarios
public class principal extends JApplet implements MouseListener{
                     public JButton bt_add = new JButton;

public void init{
.
.
.
}

private void adicionar(){
try{

			url = new URL("http://localhost/"+"MM_WebService/coloca/alpha/1");
			URLConnection connection2 =  url.openConnection();
			connection2.setConnectTimeout(10); //isso não é necessario(eu acho...)

			editor.setPage(url); // aqui ele "posta" a url, esse editor é um editorpane(que não aparece ao usuário)
			

		}catch (Exception e){
				System.out.println("erro");
		}
}
private void carregaAdicionar() {
		con_tela = new Container(); //esqueci de dizer que tem um container
		
		bt_add.setText("Adicionar Elemento");
		bt_add.addMouseListener(this); // aqui o mouselistener no botao
		bt_add.setBounds(10, 40, 150, 20);
		
		con_tela.add(bt_add);
		con_tela.add(combo);
		this.setSize(303, 350);
		
	}
@Override
	public void mouseClicked(MouseEvent e) {
		String src = e.getSource().toString(); //aqui é só um controle banal...
		if(src.contains("Adicionar Elemento")){ //...pra saber se o botão é o adicionar mesmo
				adicionar(); //executa o adicionar ali de cima
				limpa(); // o limpa só zera o container(con_tela)...
				abreStatus(); // ... para depois mostrar o abreStatus, que é só um método que "puxa" o que acabou de inserir..
			}
		}

Poxa, é um bocado de código, espero que não tenha cortado algo importante fora...
Eu até tentei fazer com actionListener, mas deu o mesmo problema.. executou 2 vezes no segundo clique, e 3 vezes no terceiro..
Qualquer ajuda é bem vinda =D

8 Respostas

ViniGodoy

Quem chama o método carregaAdicionar?

Mannes

Oh , me desculpe pela demora…
O applet tem um JMenu:

this.setMenuBar(barra) //onde barra é um JMenuBar

Logo, quando vc vai em menu>> adicionar, tem um action listener que chama o abreAdicionar, que por sua vez abre o carregaAdicionar…
Esqueci completamente disso…me desculpe…

Mannes

Aqui o código inteiro da parte do menu =D, sendo que o init faz uma chamada ao metodo menu...

public void menu() {

		this.setSize(300, 350);
		
		barra = new JMenuBar();
		menu = new JMenu("Opções");
		menu.setMnemonic(KeyEvent.VK_O);
		
		item = new JMenuItem("Status");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
		item.addActionListener(this);
		menu.add(item);
		
		item = new JMenuItem("Adicionar");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK));
		item.addActionListener(this);
		menu.add(item);

		barra.add(menu);
		
		this.setJMenuBar(barra);
		con_tela = new Container();
		this.add(con_tela);
		this.setLayout(null);
		this.setVisible(true);

	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() instanceof JMenuItem){
		String source = ((JMenuItem)e.getSource()).getText();
		if (source.equals("Status")){
			limpa();
			limpatxts();
			abreStatus();
		}
		if (source.equals("Adicionar")){
			limpa();
			abreAdcionar();
		}}
	}
ViniGodoy

O problema está justamente em adicionar o listener várias vezes. Verifique se sua lógica não está fazendo isso.

Mannes
Como assim adicionando varias vezes? Não posso fazer isso?:
item1.addActionListener(this);
item2.addActionListener(this);
item3.addActionListener(this);
E depois fazer uma verificação dentro do public void actionPerformed(ActionEvent e)?
public void actionPerformed(ActionEvent e) {

		if (e.getSource() instanceof JMenuItem){
		String source = ((JMenuItem)e.getSource()).getText();
		if (source.equals("Status")){
			limpa();
			limpatxts();
			abreStatus();
		}
		if (source.equals("Adicionar")){
			limpa();
			abreAdcionar();
		}}
	}
Mannes

Bom, mas o caso é que eu queria implementar o botão pelo mouseClick, só que acontece aquilo de duplicar , triplicar…
E só o botão “adicionar” usa o mouseClick…

Opa, acho que entendi…
Eu estou trabalhando com applet, logo quando quero “mudar a janela” eu “deleto tudo” e reconstruo a janela desejada, com isso acabo repetindo aqueles addActionListener
Como posso fazer para melhorar isso?

Mannes

Olhei algumas implementações que achei na net, resolvi fazer isso:

bt_add.setText("Adicionar Elemento");
bt_add.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				if (e.getWhen() != anterior){ //anterior é uma variavel definida antes do init, direto na class, é do tipo long, inicial = zero.
					anterior = e.getWhen(); //getWhen mostra um timestamp(datetime convertido para ms)
					adicionar();
					limpa();
					abreStatus();
				}				
			}});

eu coloquei um sysout(e.getWhen()) e percebi enquanto rodava o applet que ele entrava num tipo de loop e mostrava sempre o mesmo horario, então adicionei essa verificação,...

Acho que isso é um insulto a ti Godoy, pois sou muito inesperiente, meu conceito de OO é super basico... daqui a pouco estarei programando estruturadamente e sem métodos...hehe
Desculpe-me pela demora a responder o tópico... fiquei focado em outro "bug"

Mannes

Finalmente me toquei que o programa chamado o mesmo addActionListener várias vezes,… logo eu separei o addActionListener, que estava junto a criação de outros botões e labels, e coloquei no init, assim o addActionListener é criado só uma vez…

public void init(){ botao.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { String x = ((String) combo.getSelectedItem()).toLowerCase(); adicionar(x); //adiciona no meu BD o que o cara selecionou limpa(); // exclui qualquer container que haja na tela, para poder criar outro no lugar, pois isso é um applet abreStatus(); // cria a tela com labels e txtfields, era onde estava a chamada ao addActionListener } }); menu() // cria um menu }

Espero que isso seja útil a alguém…
Me desculpe pela incoveniencia…

Criado 12 de novembro de 2009
Ultima resposta 16 de nov. de 2009
Respostas 8
Participantes 2