JTable não está adicionando o ResultSet

Galera, preciso de uma ajuda, to fazendo uma janelinha que consulta um banco de dados e me traz o nome e o ramal da pessoa, com o JOptionPane ele exibi normalmente, mas queria que fosse adicionado no JTable. Só que fica vazio e cai na exceção.

Valeu por enquanto.

Segue o código completo abaixo.

package pack1;

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.FontUIResource;
import javax.swing.table.DefaultTableModel;

public class BuscaRamalAdvise extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTable table;
	private DefaultTableModel dtm = new DefaultTableModel();;
	private ResultSetMetaData rsmd;
	private Object obj[];
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					BuscaRamalAdvise frame = new BuscaRamalAdvise();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public BuscaRamalAdvise() {
		setResizable(false);
		setTitle("Busca Ramal");
		setIconImage(Toolkit.getDefaultToolkit().getImage(BuscaRamalAdvise.class.getResource("/pack1/agenda.png")));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 306, 249);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		table = new JTable();
		//table.setModel(dtm);
		
		JLabel lblNewLabel = new JLabel("Nome");
		lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 11));
		lblNewLabel.setBounds(76, 39, 46, 14);
		contentPane.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setFont(new Font("Tahoma", Font.PLAIN, 11));
		textField.setBounds(132, 36, 86, 20);
		contentPane.add(textField);
		textField.setColumns(10);
		
		JButton btnNewButton = new JButton("Buscar");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					Class.forName("com.mysql.jdbc.Driver").newInstance();
		            Connection con;
		            con = DriverManager.getConnection("jdbc:mysql://192.168.1.3:3306","teste","teste");
		            PreparedStatement pstmt;
	            	ResultSet rs;
		            if(textField.getText().isEmpty()){
		            	pstmt = con.prepareStatement("SELECT * FROM AGENDAADVISEBRASIL.CONTATO");
		            	rs = pstmt.executeQuery();
		            }else{
		            	pstmt = con.prepareStatement("SELECT * FROM AGENDAADVISEBRASIL.CONTATO WHERE NOME = ?");
			            pstmt.setString(1, textField.getText());
			            rs = pstmt.executeQuery();
		            }
		            
		            while (rs.next()) {
		            	rsmd = rs.getMetaData();
		            	for (int i = 0; i < rsmd.getColumnCount(); i++) {
							dtm.addColumn(rsmd.getColumnName(i));
						}
		            	obj = new Object[rsmd.getColumnCount()];
		            	obj[0] = rs.getString(0);
		            	obj[1] = rs.getInt(1);
		            	System.out.println(obj);
		            	dtm.addRow(obj);
		            	table.setModel(dtm);            	
		            	
		            	UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("Tahoma", Font.PLAIN, 11)));
		            	//UIManager.put("OptionPane.okButtonText", new FontUIResource(new Font("Tahoma", Font.PLAIN, 51)));
						JOptionPane.showMessageDialog(null, rs.getString("nome")+" está no ramal: "+rs.getInt("ramal"));
		            }
		            pstmt.close();
		            con.close();
				} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
					UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("Tahoma", Font.PLAIN, 11)));
					JOptionPane.showMessageDialog(null, "ERRO NA SELEÇÃO");
				}
			}
		});
		btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 11));
		btnNewButton.setBounds(53, 186, 89, 23);
		contentPane.add(btnNewButton);
		
		JButton btnLimpar = new JButton("Limpar");
		btnLimpar.setFont(new Font("Tahoma", Font.PLAIN, 11));
		btnLimpar.setBounds(162, 186, 89, 23);
		btnLimpar.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				textField.setText(null);
			}
		});
		contentPane.add(btnLimpar);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 66, 280, 109);
		contentPane.add(scrollPane);
		
		//table = new JTable();
		//table.setModel(dtm);
		//scrollPane.setViewportView(table);
		
	}
}

Você já parou para ler como se usar um TableModel?

Não tem como usar o JTable sem entender como o JTable funciona.

Tópico movido para o fórum de interface gráfica.