Lo único que estaba buscando era que se mostrara el contenido de la celda, algo muy simple a priori pero que, como ocurre casi siempre en Swing, acaba siendo algo rebuscado. La solución la encontré en la documentación oficial de SUN:
En este post veremos el código necesario para implementar este comportamiento.
Consiste en extender la clase JTable y sobrescribir el método:
- public String getToolTipText(MouseEvent e);
- Recuperar la fila y columna donde está apuntando el ratón
- Ver la clase (Class) de dicha columna
- Si podemos y queremos que haya mensaje emergente, extraerlo del valor de dicha celda
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int realColIndex = convertColumnIndexToModel(colIndex);
TableModel model = getModel();
if(model.getColumnClass(colIndex).equals(String.class))
return (String) model.getValueAt(rowIndex, realColIndex);
if(model.getColumnClass(colIndex).equals(Boolean.class)) {
Boolean checked = (Boolean) model.getValueAt(rowIndex, realColIndex);
if(checked)
return "Checked";
else
return "Unchecked";
}
/*
* Aqui podemos añadir todos los tipos que queramos.
* En mi caso sólo tengo String y Boolean pero podríamos tener
* enteros o cualquier otro tipo, por ejemplo para enteros sería:
* if(model.getColumnClass(colIndex).equals(Integer.class))
* return ((Integer) model.getValueAt(rowIndex, realColIndex)).toString();
*/
return "";
}Ahora, si queremos que las cabeceras también devuelvan un tooltip con el nombre que tienen asociado, debemos también liar una buena. En concreto:
- Implementar el método
protected JTableHeader createDefaultTableHeader() - Devolver un objeto JTableHeader que sobrescriba el método
public String getToolTipText(MouseEvent e) - En dicho índice recuperar el índice de columna donde está apuntando el puntero del ratón
- Devolver el título asociado a dicha columna
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
int realIndex = columnModel.getColumn(index).getModelIndex();
return getModel().getColumnName(realIndex);
}
};
}Con esto tenemos un JTable que muestra tooltips en función de su contenido, algo que en mi opinión podría venir implementado en la clase JTable y que pudiera activarse mediante una simple llamada a un método pasándole como argumento un booleano.
Para finalizar, veamos la clase al completo:
public class TooltipJTable extends JTable {
@Override
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int realColIndex = convertColumnIndexToModel(colIndex);
TableModel model = getModel();
if(model.getColumnClass(colIndex).equals(String.class))
return (String) model.getValueAt(rowIndex, realColIndex);
if(model.getColumnClass(colIndex).equals(Boolean.class)) {
Boolean checked = (Boolean) model.getValueAt(rowIndex, realColIndex);
if(checked)
return "Checked";
else
return "Unchecked";
}
return "";
}
@Override
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
@Override
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
int realIndex = columnModel.getColumn(index).getModelIndex();
return getModel().getColumnName(realIndex);
}
};
}
}Saludos

2 comentarios:
amigo puedes poner el codigo fuente para ver como lo as echo , porfavor
Muchas gracias amigo.
Me ayudara mucho en mi proyecto.
Publicar un comentario