JTable の特定の列のカスタム ツールチップを取得しようとしています。私はすでにCellRendererを作成しました(他のセル固有の属性を正常に変更しています):
private class CustomCellRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
JComponent c = (JComponent) super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if (value != null)
{
if(column == 1 && value instanceof Date)
{
final DateFormat df = new SimpleDateFormat("h:mm aa");
table.setValueAt(df.format(value), row, column);
}
else if(column == 2)
{
c.setToolTipText((String) value);
}
else if(column == 4)
{
final Mail m = main.selectedPage.messages.get(row);
JCheckBox checkBox;
if((Boolean) value)
{
checkBox = new JCheckBox()
{
@Override
public JToolTip createToolTip()
{
System.out.println("Passed");
return new ImageToolTip(m.getImage());
}
};
checkBox.setToolTipText(m.attachName);
}
else
checkBox = new JCheckBox();
checkBox.setSelected(((Boolean)value).booleanValue());
c = checkBox;
}
}
else
{
c.setToolTipText(null);
}
return c;
}
}
他の JComponent の createTooltip() メソッドをこのようにオーバーライドすると、Renderer の外ですべて正常に動作します。
checkBox = new JCheckBox()
{
@Override
public JToolTip createToolTip()
{
System.out.println("Passed");
return new ImageToolTip(m.getImage());
}
};
私が知る限り、「合格」は印刷されないため、ツールチップは別の場所に作成されます。唯一のcheckBox.setToolTipText(m.attachName);
結果は、その文字列を持つデフォルトのツールチップになります。
同様の質問をしている人を見つけましたが、唯一の解決策を完全に理解しているとは言えません。JTable を拡張してオーバーライドする必要がありますgetToolTipText(MouseEvent e)
か? もしそうなら、正しい(私の)ツールチップを取得するために何をすればよいかわかりません。
私の独学の奇妙さを許してください。前もって感謝します。:-)
編集:
getToolTipText(MouseEvent e)
Robin のおかげで、JTable のコードに基づいて何かをまとめることができました。同様の問題を抱えている他の人のためにここに残します。繰り返しますが、これが最善の方法であるかどうかはわかりませんので、以下で自由に批評してください。:-)
messageTable = new JTable()
{
@Override
public JToolTip createToolTip()
{
Point p = getMousePosition();
// Locate the renderer under the event location
int hitColumnIndex = columnAtPoint(p);
int hitRowIndex = rowAtPoint(p);
if ((hitColumnIndex != -1) && (hitRowIndex != -1))
{
TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
if (component instanceof JCheckBox)
{
Image img = main.selectedPage.messages.get(hitRowIndex).getImage();
if(((JCheckBox) component).isSelected())
return new ImageToolTip(img);
}
}
return super.createToolTip();
}
}