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 necessariospublicclassprincipalextendsJAppletimplementsMouseListener{publicJButtonbt_add=newJButton;publicvoidinit{...}privatevoidadicionar(){try{url=newURL("http://localhost/"+"MM_WebService/coloca/alpha/1");URLConnectionconnection2=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(Exceptione){System.out.println("erro");}}privatevoidcarregaAdicionar(){con_tela=newContainer();//esqueci de dizer que tem um containerbt_add.setText("Adicionar Elemento");bt_add.addMouseListener(this);// aqui o mouselistener no botaobt_add.setBounds(10,40,150,20);con_tela.add(bt_add);con_tela.add(combo);this.setSize(303,350);}@OverridepublicvoidmouseClicked(MouseEvente){Stringsrc=e.getSource().toString();//aqui é só um controle banal...if(src.contains("Adicionar Elemento")){//...pra saber se o botão é o adicionar mesmoadicionar();//executa o adicionar ali de cimalimpa();// 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
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...
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(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){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…