[Dúvida] Adicionar Tooltip às linhas de uma JTable!

Olá, galerinha do GUJ!
Tudo beleza?

Estou em um projeto, e me surgiu a seguinte dúvida:
Eu quero que, ao passar o mouse sobre uma linha de minha JTable, uma Tooltip apareça sobre aquela linha, exibindo uma informação qualquer.
Para isso, deve-se usar o evento mouseEntered, da interface MouseListener.
Até aí tudo bem, mas… Como devo fazer para essa Tooltip aparecer sobre a linha na qual passei o mouse?

Valeu, galera, fiquem com Deus!
Abraços!

Não use o MouseEntered, que isso não funciona. Em vez disso, você tem de mudar o TableCellRenderer. Vou dar um exemplo se tiver tempo.

package guj;

import java.awt.BorderLayout;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

class Pair<T, U> {
    public T first;
    public U second;

    public Pair(T t, U u) {
        first = t;
        second = u;
    }
}

public class ExemploJTableTooltip extends JFrame {
    static class Cliente {
        private String nome;
        private String endereco;
        private int id;
        private Date data;

        public Cliente(final String nome, final String endereco, final int id, final Date data) {
            this.nome = nome;
            this.endereco = endereco;
            this.id = id;
            this.data = data;
        }

        public String getNome() {
            return nome;
        }

        public String getEndereco() {
            return endereco;
        }

        public int getId() {
            return id;
        }

        public Date getData() {
            return data;
        }
    }

    static class TabelaClienteModel extends AbstractTableModel {
        public TabelaClienteModel(List<Cliente> clientes) {
            this.clientes = clientes;
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public int getRowCount() {
            return clientes.size();
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch (columnIndex) {
            case 0:
                return new Pair<String, String>(clientes.get(rowIndex).getNome(), clientes.get(rowIndex).getEndereco());
            case 1:
                return new Pair<Integer, Date>(clientes.get(rowIndex).getId(), clientes.get(rowIndex).getData());
            default:
                return null;
            }
        }

        private List<Cliente> clientes;
    }

    static class PairTableCellRenderer extends DefaultTableCellRenderer {
        public PairTableCellRenderer() {
            super();
        }

        public PairTableCellRenderer(Format f1, Format f2) {
            super();
            this.f1 = f1;
            this.f2 = f2;
        }

        @Override
        protected void setValue(Object value) {
            String s;
            if (value == null)
                s = "";
            else if (value instanceof Pair<?, ?>) {
                @SuppressWarnings("unchecked")
                Pair v = (Pair) value;
                if (f1 == null)
                    s = v.first.toString();
                else
                    s = f1.format(v.first);
                if (f2 == null)
                    setToolTipText(v.second.toString());
                else
                    setToolTipText(f2.format(v.second));
            } else {
                s = value.toString();
            }
            setText(s);
        }

        private Format f1;
        private Format f2;
    }

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JScrollPane scpTabela = null;
    private JTable tblTabela = null;

    private JScrollPane getScpTabela() {
        if (scpTabela == null) {
            scpTabela = new JScrollPane();
            scpTabela.setViewportView(getTblTabela());
        }
        return scpTabela;
    }

    private JTable getTblTabela() {
        if (tblTabela == null) {
            tblTabela = new JTable(new TabelaClienteModel(clientes));
            tblTabela.getColumnModel().getColumn(0).setCellRenderer(new PairTableCellRenderer());
            tblTabela.getColumnModel().getColumn(1).setCellRenderer(
                new PairTableCellRenderer(new DecimalFormat("#,##0"), new SimpleDateFormat("dd/MM/yyyy")));
        }
        return tblTabela;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ExemploJTableTooltip thisClass = new ExemploJTableTooltip();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    public ExemploJTableTooltip() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("Exemplo JTable com Tooltip");
        try {
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            clientes.add(new Cliente("Luis Inacio", "Palacio da Alvorada", 123456, df.parse("01/04/2010")));
            clientes.add(new Cliente("Nicolas Sarkozy", "Palais de l'Élysée", 789102, df.parse("02/04/2010")));
            clientes.add(new Cliente("Barack Obama", "White House", 1288388, df.parse("03/04/2010")));
        } catch (ParseException ex) {
        }
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getScpTabela(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

    private List<Cliente> clientes = new ArrayList<Cliente>();
}

Rodando o exemplo: