Usanso JButton

Caros amigos, estou com uma certa dificuldade com o JButton, gostaria de saber como fazer para abrir um JFrame diferente usando um JButton?

Brother… como já estudei isso tbem, tenho um exemplo.

Pega esse meu exemplo de código e dê uma estudada,
ele além de chamar outra janela chama uma janela modal (estilo modal do vb)

Código java para a primeira janela

//Janela1.java
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


   
public class Janela1 extends JFrame implements ActionListener {  

	JPanel panButtons = new JPanel(); // painel com os botoes da aplicacao
	JScrollPane scroll = new JScrollPane(); // scroll para conter viewPort sob um JTable

	// componentes basicos
	JButton button;

	Janela1 {
		super("Janela 1");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(10, 10, 400,400);  

        // definindo o formato do contentPanel
        getContentPane().setLayout(new BorderLayout());
        
    	// criacao da tabela (model e view)
    	String [] colunas = new String[]{"Estado", "Capital"};
    	String[][] dados = new String[][] {
    			{"SP", "Sao Paulo"},
    			{"RJ", "Rio de Janeiro"}};

		DefaultTableModel modelo 	= new DefaultTableModel(dados, colunas);
		JTable table 				= new JTable(modelo);
		scroll.setViewportView(table); // adicionando o componente dentro do viewPort
		
		// criando o painel com botoes
		panButtons.setLayout(new FlowLayout());
		
		button = new JButton("Adicionar");
		button.addActionListener(this);
		button.setName("add");
		panButtons.add(button);
		
		button = new JButton("Remover");
		button.addActionListener(this);
		panButtons.add(button);
		
		// adicionando tudo no painel principal (contentPane)
		add(scroll, 	BorderLayout.CENTER);
		add(panButtons, BorderLayout.SOUTH);
	}
	
	public void actionPerformed( ActionEvent e ) {
		JButton btSource = (JButton)e.getSource();

		if (btSource.getName() == "add") {
			Janela2 fm = new Janela2(this);
			fm.setVisible(true);
		}
	}

}  

Código java para a segunda janela

//Janela2.java
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Janela2 extends JDialog {

	private JPanel pan, panbt;
	private JLabel lbl;
	private JTextField txt;
	private JButton button;
	
	Janela2(JFrame pai) {
		super(pai, true);
		
		super.getContentPane().setLayout(new BorderLayout());

		// campos da tela
		pan = new JPanel(new GridLayout(4,2));
		
		lbl = new JLabel("id:");
		txt = new JTextField(20);
		pan.add(lbl, 0); pan.add(txt, 1);

		lbl = new JLabel("nome:");
		txt = new JTextField(20);
		pan.add(lbl, 0); pan.add(txt, 1);

		lbl = new JLabel("email:");
		txt = new JTextField(20);
		pan.add(lbl, 0); pan.add(txt, 1);

		lbl = new JLabel("endereco:");
		txt = new JTextField(20);
		pan.add(lbl, 0); pan.add(txt, 1);
		
		// botoes
		panbt = new JPanel(new FlowLayout());

		button = new JButton("Save");
		panbt.add(button);
		
		button = new JButton("Cancel");
		panbt.add(button);

		// adicionando no jframe
		add(pan, BorderLayout.CENTER);
		add(panbt, BorderLayout.SOUTH);
		
		super.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
		super.setBounds(10, 10, 400,400);
	}
	
}