我有一个自定义项TableCellRenderer
,我想根据鼠标在单元格中的位置显示不同的工具提示。我遇到的问题getWidth()
是0
从getToolTipText
.
这是一个SSCCE:
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.MouseEvent;
public class Sandbox {
public static void main(String[] args) {
JFrame testFrame = new JFrame("Test");
testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
testFrame.setLayout(new BorderLayout());
JTable testTable = new JTable(new Object[][]{{"Value 1", null}}, new Object[] {"Column 1", "Column 2"});
testTable.getColumnModel().getColumn(1).setCellRenderer(new CustomCellRenderer());
testFrame.add(new JScrollPane(testTable), BorderLayout.CENTER);
testFrame.pack();
testFrame.setLocationRelativeTo(null);
testFrame.setVisible(true);
}
private static class CustomCellRenderer implements TableCellRenderer {
private final JLabel renderer = new JLabel()
{
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.RED);
g.fillRect(0, 0, getWidth(), getHeight());
System.out.println("Width from paintComponent = " + getWidth());
}
@Override
public String getToolTipText(MouseEvent event) {
System.out.println("Width from getToolTipText = " + getWidth());
return super.getToolTipText(event);
}
};
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
return renderer;
}
}
}
您可以看到组件已调整大小,并且从paintComponent
方法中打印出正确的结果。但是,当您将鼠标悬停在“第 2 列”中的单元格上时,该getToolTipText
方法不会打印相同的值。
我发现以前问过类似的问题,但答案通常是Component
尚未调整大小。在我的例子中,组件的大小已经很明显了。有人可以解释为什么在方法中getWidth()
返回吗?有一个更好的方法吗?0
getToolTipText