The following shows JTable cells each containing a panel that in turn contains two labels. I've set tooltips on the JLabels, but they don't show up. (And thanks to @MadProgrammer for the original stripped-down code to display a JTable and illustrate setToolTipLocation().)
I override getToolTipText() for one label, and call setToolTipText() for another; if I set a breakpoint in the former one, it is called but no tooltip appears. So I tried overriding setToolTipLocation(), though I'm not sure what appropriate values are for it; I'm not sure what coordinate system it would use, figured 10,10 would leave it in range of most things.
It's not shown here, I've also tried creating the labels outside the getTableCellRendererComponent() call, and setting their dimensions, background colors, and tooltips within getTableCellRendererComponent(). That doesn't work either.
What else do I need to do to see those tooltips?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class Test
{
Border labelBorder = BorderFactory.createLineBorder(Color.black);
public static void main(String[] args)
{
new Test();
}
public Test()
{
EventQueue.invokeLater
(new Runnable()
{
@Override
public void run()
{
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
);
}
public class TestPane extends JPanel
{
public TestPane()
{
setLayout(new BorderLayout());
int rows = 4;
int cols = 3;
DefaultTableModel model = new DefaultTableModel(0, cols);
for (int row = 0; row < rows; row++)
{
Object[] data = new Object[cols];
for (int col = 0; col < cols; col++)
{
data[col] = row + "x" + col;
}
model.addRow(data);
}
JTable table = new JTable(model);
// table.setToolTipText("table text"); // this works, but would block tooltips from UI children
table.setDefaultRenderer(Object.class, new TestCellRenderer());
add(new JScrollPane(table));
}
public class TestCellRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column)
{
// create two labels, put them side-by-side in a panel, and return
// the panel as the component being rendered.
JLabel label1 = new JLabel("a Banana @" + value.toString())
{
@Override
public String getToolTipText()
{
return "AA";
}
@Override public Point getToolTipLocation(MouseEvent mouseEvent) { return new Point(10,10); }
};
label1.setBorder(labelBorder);
label1.setToolTipText("AA"); // this tooltip text does not show up.
JLabel label2 = new JLabel("b Banana @" + value.toString());
label2.setBorder(labelBorder);
label2.setToolTipText("BB"); // this tooltip text does not show up.
JPanel panel = new JPanel();
BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
panel.setLayout(layout);
// panel.setToolTipText("panel text"); //this works, but would block tooltips on the JLabels
panel.add(label1);
panel.add(label2);
return panel;
}
}
}
}