Exibindo valor digitado em um JTextField em um ActionListener

10 respostas
R

Oi, gostaria de saber como manipular valores digitados em JTextField no evendo ActionListener. Tentei isso através do código abaixo, mas dá erro na linha JOptionPane.showMessageDialog(null, "REGISTRO SALVO COM SUCESSO PARA "+nome); se alguém puder corrigir este código figo grato.

import javax.swing.<em>;

import java.awt.</em>;

import java.awt.event.*;

public class Form01 extends JFrame{

public Form01(){

// criando frame com cabecalho e desabilitando layout automatico

JFrame frame = new JFrame(RMFAIS - SOLUÇÕES E TECNOLOGIAS);

frame.setLayout(null);
// criando labels com coordenadas setBounds
  frame.add(new JLabel("<HTML><H2>Form01 - MODELO DE CADASTRO<HR>")).setBounds(05, 03, 500,40);
  frame.add(new JLabel("Codigo:")).setBounds(05,  50, 60, 20);
  frame.add(new JLabel("  Nome:")).setBounds(05,  70, 60, 20);

  // criando caixas de texto com coordenadas setBounds
  JTextField codigo = new JTextField();
  frame.add(codigo).setBounds(100, 50, 60,20);
  JTextField nome = new JTextField();
  frame.add(nome).setBounds(100, 70, 500,20);

  // criando botoes com coordenadas setBounds
  JButton salvar = new JButton("Salvar");
  frame.add(salvar).setBounds(05, 400, 80,20);

  // executando acao para botoes
  salvar.addActionListener (new ActionListener(){
     public void actionPerformed(ActionEvent e){
        /******** implemente aqui todo codigo necessario para acao do botao **********/
        JOptionPane.showMessageDialog(null, "REGISTRO SALVO COM SUCESSO PARA "+nome);  
     }
  });

  // exibindo texto no rodape do programa
  frame.add(new JLabel("<html><hr>Programador: Roni Márcio Fais - www.rmfais.com")).setBounds(05, 430, 500,20);

  // tornando frame visivel
  frame.setSize(640,480);
  frame.setLocationRelativeTo( null );		
  frame.setVisible(true);
  //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){

new Form01();

}

}

10 Respostas

Eric_Yuzo

Para pegar o texto escrito no text field use o método getText:

JOptionPane.showMessageDialog(null, "REGISTRO SALVO COM SUCESSO PARA "+nome.getText());

Procure usar layout managers para organizar seus componentes na tela. Null layout pode te causar problemas no futuro.

E para postar código fonte no fórum, utilize a tag code: http://www.guj.com.br/posts/list/50115.java

R

Valeu pelas dicas, mas infelizmente continua dando erro na linha JOptionPane.showMessageDialog(null, "REGISTRO SALVO COM SUCESSO PARA "+nome.getText()); se alguem puder solucionar o enigma, agradeço de coração…

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Form01 extends JFrame{

   public Form01(){
      // criando frame com cabecalho e desabilitando layout automatico
      JFrame frame = new JFrame("RMFAIS - SOLUÇÕES E TECNOLOGIAS");
      frame.setLayout(null);

      // criando labels com coordenadas setBounds
      frame.add(new JLabel("<HTML><H2>Form01 - MODELO DE CADASTRO<HR>")).setBounds(05, 03, 500,40);
      frame.add(new JLabel("Codigo:")).setBounds(05, 50, 60, 20);
      frame.add(new JLabel(" Nome:")).setBounds(05, 70, 60, 20);

      // criando caixas de texto com coordenadas setBounds
      JTextField codigo = new JTextField();
      frame.add(codigo).setBounds(100, 50, 60,20);
      JTextField nome = new JTextField();
      frame.add(nome).setBounds(100, 70, 500,20);

      // criando botoes com coordenadas setBounds
      JButton salvar = new JButton("Salvar");
      frame.add(salvar).setBounds(05, 400, 80,20);

      // executando acao para botoes
      salvar.addActionListener (new ActionListener(){
         public void actionPerformed(ActionEvent e){
            JOptionPane.showMessageDialog(null, "REGISTRO SALVO COM SUCESSO PARA "+nome.getText());
         }
      });

      // exibindo texto no rodape do programa
      frame.add(new JLabel("<html><hr>Programador: Roni Márcio Fais - www.rmfais.com")).setBounds(05, 430, 500,20);

      // tornando frame visivel
      frame.setSize(640,480);
      frame.setLocationRelativeTo( null );
      frame.setVisible(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }

   public static void main(String[] args){
      new Form01();
   }
}
ViniGodoy
  1. Declare a variável nome como final (aliás, não é isso que a mensagem de erro diz para você fazer?);
final JTextField nome = new JTextField();
  1. Outra coisa, a linha correta é:
JOptionPane.showMessageDialog(Form01.this, "REGISTRO SALVO COM SUCESSO PARA "+nome.getText());

Como informa o javadoc, o primeiro parâmetro deve conter o owner, ou seja, a janela que abriu seu JOptionPane. Passar null nesse parâmetro vai trazer problemas no ALT+TAB.

R

Grande ViniGogoy, valeu pela ajuda, a dica de usar final e Form01.this resolveu o problema. Eu gostaria de entender teoricamente para que serve a declaração “final” nesse caso em particular, já que, pelo jeito, terei que usa-la se quiser manipular os JTextField em ActionListener. Grande abraço…

ViniGodoy

Agora, você quer acessar o valor de uma variável temporária no interior de uma inner class. O java não pode fazer isso sem saber que esse valor não irá mudar posteriormente. Para garantir que ele não irá mudar, você declara a variável temporária como final.

Outra possibilidade seria declarar o seu JTextField como um atributo da sua classe. Eu recomendo que você faça isso, já que muito provavelmente você precisará usar o seu JTextfield em outros métodos.

Veja como ficaria melhor:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Form01 extends JFrame{
   private JTextField codigo = new JTextField();
   private JTextField nome = new JTextField();
   private JButton salvar = new JButton("Salvar");

   public Form01(){
      // Não tem porque criar 2 JFrames se Form01 já é um JFrame!
      super("RMFAIS - SOLUÇÕES E TECNOLOGIAS");
      setLayout(null);

      // criando labels com coordenadas setBounds
      add(new JLabel("<HTML><H2>Form01 - MODELO DE CADASTRO<HR>")).setBounds(05, 03, 500,40);
      add(new JLabel("Codigo:")).setBounds(05, 50, 60, 20);
      add(new JLabel(" Nome:")).setBounds(05, 70, 60, 20);

      // criando caixas de texto com coordenadas setBounds
      frame.add(codigo).setBounds(100, 50, 60,20);
      frame.add(nome).setBounds(100, 70, 500,20);

      // criando botoes com coordenadas setBounds
      frame.add(salvar).setBounds(05, 400, 80,20);

      // executando acao para botoes
      salvar.addActionListener (new ActionListener(){
         public void actionPerformed(ActionEvent e){
            JOptionPane.showMessageDialog(Form01.this, "REGISTRO SALVO COM SUCESSO PARA "+nome.getText());
         }
      });

      // exibindo texto no rodape do programa
      add(new JLabel("<html><hr>Programador: Roni Márcio Fais - www.rmfais.com")).setBounds(05, 430, 500,20);

      // Ajustando o tamanho do frame
      setSize(640,480);
      setLocationRelativeTo( null );
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }

   public static void main(String[] args){
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            //Nunca torne o frame visível no construtor
            new Form01().setVisible(true);
         }
      }
   }
}
R

Brigadão Vini, fiz um curso básico de java já faz uns dez anos, depois disso nunca mais programei em java, atualmente trabalho só com PHP. Graças a pessoas como você o fórum tem sido de grande ajuda. Abs…

ViniGodoy

De nada.
Observe que no código cima eu removi o Frame adicional que você estava criando. E também tirei o setVisible do construtor.

R

Gostei das alterações e dos esclarecimentos, pode dar algum conflito se eu deixar o metodo main conforme mostrado abaixo??? Compilei e nao deu erro.

public static void main(String[] args){  
            new Form01().setVisible(true);  
   }
ViniGodoy

Dificlmente pode dar problema, nesse caso específico. O que ocorre é que o Swing tem uma thread própria e, idealmente, você não deveria mexer em componentes swing fora dela. O main não roda na thread do Swing, mas na main thread.

Aquele comando EventQueue.invokeLater empilha um pedido para o Swing fazer o trabalho na thread dele. Note que apesar do Runnable, ele não cria uma nova thread. O runnable é apenas uma interface de algo que pode ser executado em algum lugar. Se você usar com a classe Thread, será um nova thread, se você usar no EventQueue.invokeLater, será na thread do Swing.

É uma boa prática deixar do jeito que indiquei (por isso indiquei dessa forma).

R

Blz Vini, mais uma vez fico muito grato pelos esclarecimentos

Criado 21 de dezembro de 2010
Ultima resposta 21 de dez. de 2010
Respostas 10
Participantes 3