gpt4 book ai didi

java - 在自定义 CellRenderer 中覆盖 createToolTip()

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:31:33 25 4
gpt4 key购买 nike

我正在尝试为 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() 方法时,它在渲染器之外一切正常。

checkBox = new JCheckBox()
{
@Override
public JToolTip createToolTip()
{
System.out.println("Passed");
return new ImageToolTip(m.getImage());
}
};

据我所知,工具提示是在别处创建的,因为“已通过”甚至从未打印过。 checkBox.setToolTipText(m.attachName); 只会生成带有该字符串的默认工具提示。

我找到了一个 similar question 的人,但我不能说我完全理解唯一的解决答案。我是否需要扩展 JTable 并覆盖 getToolTipText(MouseEvent e)?如果是这样,我不确定如何获得正确的(我的)工具提示。

请原谅我自学成才的怪癖。提前致谢。 :-)

编辑:

感谢 Robin,我能够根据 JTable 的 getToolTipText(MouseEvent e) 代码拼凑出一些东西。我会把它留给其他有类似问题的人。同样,我不确定这是最好的方法,所以请在下面随意批评它。 :-)

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();
}
}

最佳答案

您无法为单元格渲染器中的复选框创建工具提示。实际上,当您尝试将鼠标移到它上面时,该组件并不存在。它只是一个图像。您需要为 JTable 创建工具提示

private void tableMouseMoved(java.awt.event.MouseEvent evt) {
String toolTipText;
int row = table.rowAtPoint(evt.getPoint());
int column = table.columnAtPoint(evt.getPoint());

if (row >= 0) {
Object o = table.getValueAt(row, column);
if (column == YourTableModel.COLUMN_INDEX_WITH_CHECKBOX) {
Boolean value = (Boolean) o;
if (value == Boolean.TRUE) {
toolTipText = "Tooltip text for true value";
} else {
toolTipText = "Tooltip text for false value";
}
}
}
}

当然你需要为 MouseEvent 注册监听器:

javax.swing.JTable table = new JTable();
table.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
tableMouseMoved(evt);
}
});

关于java - 在自定义 CellRenderer 中覆盖 createToolTip(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10315714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com