Boa noite, estou com uma duvida simples…para criar um Listener tenho que criar uma classe, ok…mas eu queria saber se posso criar uma classe com o nome Eventos e dentro dela criar varios metodos que serao os listeners.
Por exemplo, tenho 5 botoes, cada um faz uma ação, entao soh preciso criar uma classe com metodos por exemplo pra fechar um Frame, pra fazer uma conta, pra minimizar, pra deixar fullscreen, pra limpar a tela…entenderam? entao, é possivel fazer isso ou tenho que criar uma classe pra cada ação?
importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JOptionPane;publicclassTelaextendsJFrame{JButtonb1=newJButton("B1");JButtonb2=newJButton("B2");JButtonb3=newJButton("B3");JButtonb4=newJButton("B4");publicTela(){this.ajustaTela();this.addElementos();this.addActionListeners();}privatevoidaddActionListeners(){b1.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){exibeMensagem("Você clicou no botão b1");}});b2.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){exibeMensagem("Você clicou no botão b2");}});b3.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){exibeMensagem("Você clicou no botão b3");}});b4.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){exibeMensagem("Saindo");dispose();}});}privatevoidexibeMensagem(Stringtexto){//Ao invés de vc chamar esse método no seu action listener, vc pode chamar//métodos de outras classes.JOptionPane.showMessageDialog(this,texto);}privatevoidaddElementos(){getContentPane().add(b1);getContentPane().add(b2);getContentPane().add(b3);getContentPane().add(b4);}privatevoidajustaTela(){setSize(200,200);setLocationRelativeTo(null);setLayout(newGridLayout(2,2));setResizable(false);setDefaultCloseOperation(DISPOSE_ON_CLOSE);setVisible(true);}publicstaticvoidmain(String[]args){newTela();}}
Eu sempre crio os actionlisteners na mesma classe em que está o meu botão, se precisar chamo um método dentro deles ou até mesmo um método que esteja em outra classe.
Foi isso que vc queria saber?
guilherme.dio
Parece bom deste jeito também, mas então não é possivel fazer isto em outra classe?
renamed
Para mim vai ficar mais bagunçado, pq vc terá de fazer essa classe implementar a interface ActionListener, criar um método e enchê-lo de if para testar qual botão seu foi clicado, exatamente o mesmo se sua tela implementasse o ActionListener.
Seu código vai ficar meio espagueti (cheio de if) e vc vai criar uma classe para ter, basicamente, um método.
Mas sim, se mesmo assim vc quiser fazer é possível embora “feio”. :lol:
E
elissonandrade
Infelizmente, não possível escolher outro método além do actionPerformed para responder aos comandos que você criar.
S
seliaj
Olá
veja se é isso que queres implementar, segue um exemplo que envolve tres classes:
====================================================
1 - Action Support
packagejavaapplication1;importjava.awt.event.*;importjava.util.*;/** * * Author Information * @author Jailes M S Pantoja * @email [email removido] * @locale Brazil - Para - Belem * */publicclassActionSupportimplementsActionListener{//java.awt.WindowprivateClass<?>window;/** * Creates a new instance of ActionSupport */publicActionSupport(Class<?>window){this.window=window;}privateList<ActionListener>listeners=newArrayList<ActionListener>();publicvoidaddActionListener(ActionListenerlistener){listeners.add(listener);}publicvoidremoveActionListener(ActionListenerlistener){listeners.remove(listener);}publicvoidfireActionEvent(ActionEvente){Iterator<ActionListener>it=listeners.iterator();while(it.hasNext()){ActionListenerlistener=it.next();listener.actionPerformed(newActionEvent(window,ActionEvent.ACTION_PERFORMED,e.getActionCommand()));}}@OverridepublicvoidactionPerformed(ActionEvente){fireActionEvent(e);}}
=======================================================
2 - O Controle
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagejavaapplication1;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;/** * * @author Jailes Pantoja * @mail [email removido] * */publicclassClasseControleimplementsActionListener{privatestaticJFrameViewmainView=null;publicClasseControle(){mainView=newJFrameView();mainView.pack();mainView.setTitle("Teste de MVC");mainView.setVisible(true);mainView.addActionListener(this);mainView.setResizable(true);}@OverridepublicvoidactionPerformed(ActionEvente){if(e.getActionCommand().equals("cmdUm")){mainView.setTexto("Butao Um Acionado");}if(e.getActionCommand().equals("cmdDois")){mainView.setTexto("Butao Dois Acionado");}if(e.getActionCommand().equals("cmdTres")){mainView.setTexto("Butao Tres Acionado");}}publicstaticvoidmain(String[]vars){ClasseControleclasseControle=newClasseControle();}}
=============================================================
3 - O View
/* * To change this template, choose Tools | Templates * and open the template in the editor. *//* * JFrameView.java * * Created on Mar 8, 2011, 8:44:40 PM */packagejavaapplication1;importjava.awt.event.ActionListener;/** * * @author Jailes Pantoja * @mail [email removido] * */publicclassJFrameViewextendsjavax.swing.JFrame{ActionSupportactionSupport=newActionSupport(JFrameView.class);publicvoidaddActionListener(ActionListenerlistener){actionSupport.addActionListener(listener);}/** Creates new form JFrameView */publicJFrameView(){initComponents();jButton1.setActionCommand("cmdUm");jButton1.addActionListener(actionSupport);jButton2.setActionCommand("cmdDois");jButton2.addActionListener(actionSupport);jButton3.setActionCommand("cmdTres");jButton3.addActionListener(actionSupport);}publicvoidsetTexto(Stringtexto){jTextField1.setText(texto);}/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code">privatevoidinitComponents(){jButton1=newjavax.swing.JButton();jButton2=newjavax.swing.JButton();jButton3=newjavax.swing.JButton();jTextField1=newjavax.swing.JTextField();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);jButton1.setText("jButton1");jButton2.setText("jButton2");jButton3.setText("jButton3");jTextField1.setText("jTextField1");javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING,false).addComponent(jTextField1,javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.LEADING,layout.createSequentialGroup().addComponent(jButton1).addGap(18,18,18).addComponent(jButton2).addGap(18,18,18).addComponent(jButton3))).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE)));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addContainerGap().addComponent(jTextField1,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,169,Short.MAX_VALUE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jButton1).addComponent(jButton2).addComponent(jButton3)).addContainerGap()));pack();}// </editor-fold>// Variables declaration - do not modifyprivatejavax.swing.JButtonjButton1;privatejavax.swing.JButtonjButton2;privatejavax.swing.JButtonjButton3;privatejavax.swing.JTextFieldjTextField1;// End of variables declaration}
Lembrando que é apenas um esboço.
guilherme.dio
Seliaj, o seu modo parece resolver meu problema, mas é muito avançado para o meu nível, kkkkk…
Axo que vou tentar fazer tudo na mesma classe msm, porem vou encontrar o problema de n poder criar um metodo pra cada Listener, pois devem ter o nome actionPerformed, estou pensando num jeito
S
seliaj
Guilherme,
Tudo na mesma classe, com cada button acionado um metodo especifico:
/* * To change this template, choose Tools | Templates * and open the template in the editor. *//* * JFrameView.java * * Created on Mar 8, 2011, 8:44:40 PM */packagejavaapplication1;importjava.awt.event.ActionListener;/** * * @author Jailes Pantoja * @mail [email removido] * */publicclassJFrameViewextendsjavax.swing.JFrame{/** Creates new form JFrameView */publicJFrameView(){initComponents();}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newJFrameView().setVisible(true);}});}/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code">privatevoidinitComponents(){jButton1=newjavax.swing.JButton();jButton2=newjavax.swing.JButton();jButton3=newjavax.swing.JButton();jTextField1=newjavax.swing.JTextField();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);jButton1.setText("jButton1");jButton1.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jButton1ActionPerformed(evt);}});jButton2.setText("jButton2");jButton2.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jButton2ActionPerformed(evt);}});jButton3.setText("jButton3");jButton3.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jButton3ActionPerformed(evt);}});jTextField1.setText("jTextField1");javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING,false).addComponent(jTextField1,javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.LEADING,layout.createSequentialGroup().addComponent(jButton1).addGap(18,18,18).addComponent(jButton2).addGap(18,18,18).addComponent(jButton3))).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE)));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addContainerGap().addComponent(jTextField1,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,169,Short.MAX_VALUE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jButton1).addComponent(jButton2).addComponent(jButton3)).addContainerGap()));pack();}// </editor-fold>privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){jTextField1.setText("Button One Acionado - Metodo 1");}privatevoidjButton2ActionPerformed(java.awt.event.ActionEventevt){jTextField1.setText("Button One Acionado - Metodo 2");}privatevoidjButton3ActionPerformed(java.awt.event.ActionEventevt){jTextField1.setText("Button One Acionado - Metodo 3");}// Variables declaration - do not modifyprivatejavax.swing.JButtonjButton1;privatejavax.swing.JButtonjButton2;privatejavax.swing.JButtonjButton3;privatejavax.swing.JTextFieldjTextField1;// End of variables declaration}
Ats,
Jailes
guilherme.dio
Jailes obrigado, agora posso resolver meu problema, agradeço a todos que colaboraram!
Agora eu possuo um outro problema, eu fiz um evento que por sua vez acaba adicionando um outro botão na tela, e ao clicar nesse botao ele deve realizar um verificação(if/else) com uma variavel que esta dentro do primeiro evento, porem nao consigo realizar, quando cito a variavel dentro desse otro evento, o NetBeans me da um erro:
[color=red]local variable idade is accessed from within inner class; needs to be declared final[/color]
guilherme.dio
Desculpem-me, ja consegui resolver este erro anterior, más agora infelizmente tenho outro, eu estou pegando dados Strings de 4 JTextFields, e um botao tem que pegar esses dados e mostrar em algum campo, tentei mostar em um JTextField ampliado, mas fica tudo escrito na mesma linhas, msm usando o \n…alguem poderia me dizer qual o componente mais apropriado para realizar essa exposição dos dados?
OBS: estou usando esse comando para transformar um valor String em Int, sera que é isso?
int idade=Integer.parseInt(campo[2].getText());
Percebi que se eu comento essa linha, tudo funciona normalmente…alias, esta linha esta dentro de um evento, onde faz algumas verificações, e acaba por pegar um valor String numa area de texto e converte-lo em numerico(onde uso esse comando).