Exibindo valor digitado em um JTextField em um ActionListener

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.;
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){
        /******** 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();
}
}

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

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();
   }
} 
  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.

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…

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:

[code]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);
}
}
}
}
[/code]

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…

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.

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);  
   }  

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).

Blz Vini, mais uma vez fico muito grato pelos esclarecimentos