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:
