Java 仅当列被切断时才在JTable中显示工具提示
当值太长时,如何实现为每个单元格显示提示的工具提示 我只有一个表格渲染器,它给我一些单元格着色。所以我认为最简单的方法就是在其中实现metodJava 仅当列被切断时才在JTable中显示工具提示,java,jtable,tooltip,tablecellrenderer,Java,Jtable,Tooltip,Tablecellrenderer,当值太长时,如何实现为每个单元格显示提示的工具提示 我只有一个表格渲染器,它给我一些单元格着色。所以我认为最简单的方法就是在其中实现metod public class ColorRenderer extends DefaultTableCellRenderer { final int STATUS_COL = 7; @Override public Component getTableCellRendererComponent(JTable table,
public class ColorRenderer extends DefaultTableCellRenderer {
final int STATUS_COL = 7;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean
hasFocus,
int row, int col) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int modelIndex = table.convertRowIndexToModel(row);
String type = (String) table.getModel().getValueAt(modelIndex, 7);
if ("".endsWith(type)) {
component.setBackground(table.getBackground());
component.setForeground(table.getForeground());
} else {
component.setBackground(Color.RED);
component.setForeground(Color.WHITE);
}
if (isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
return component;
}
}
提前感谢。默认情况下,为表格单元格显示的工具提示文本由单元格的渲染器决定。但是,有时,通过重写JTable的getToolTiptText(MouseeEvent)方法实现来指定工具提示文本会更简单,因此您可以添加
setToolTipText(...);
在gettableCellRenderComponent
方法中,包含实际单元格值
所以你得到了
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int modelIndex = table.convertRowIndexToModel(row);
String type = (String) table.getModel().getValueAt(modelIndex, 7);
if ("".endsWith(type)) {
component.setBackground(table.getBackground());
component.setForeground(table.getForeground());
} else {
component.setBackground(Color.RED);
component.setForeground(Color.WHITE);
}
if (isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
setToolTipText(...);
return component;
}
首先重写
JTable
的gettooltipext(MouseEvent)
事件
public String getToolTipText(MouseEvent e) {
String toolTipText = null;
获取给定鼠标位置的单元格坐标
Point p = e.getPoint(); // MouseEvent
int col = columnAtPoint(p);
int row = rowAtPoint(p);
获取单元格的当前大小,这样我们就知道当前的约束条件是什么
Rectangle bounds = getCellRect(row, col, false);
根据模型中单元的当前值获取单元的渲染器
Object value = getValueAt(row, col);
Component comp = prepareRenderer(getCellRenderer(row, col), row, col);
将渲染器组件的首选大小与单元格大小进行比较
if (comp.getPreferredSize().width > bounds.width) {
toolTipText = comp.getToolTipText();
}
返回工具提示
return toolTipText;
}
解决方案:
JTable auditTable = new JTable(){
public String getToolTipText(MouseEvent e) {
String toolTipText = null;
Point p = e.getPoint(); // MouseEvent
int col = columnAtPoint(p);
int row = rowAtPoint(p);
Component comp = prepareRenderer(getCellRenderer(row, col), row, col);
Rectangle bounds = getCellRect(row, col, false);
try {
//comment row, exclude heading
if (comp.getPreferredSize().width > bounds.width) {
toolTipText = getValueAt(row, col).toString();
}
} catch (RuntimeException e1) {
//catch null pointer exception if mouse is over an empty line
}
return toolTipText;
}
};
我可以想到两种方法,覆盖
JTable
或TableCellRenderer
的getToolTip(MouseEvent)
方法,将单元格大小与渲染器的大小进行比较,如果合适,则返回null
,如果不合适,则返回工具提示值……请参见我的答案@madprogrammerTableCellRenderer
将不知道调用GetTableCellRenderComponent
时JTable
的大小,它只会知道它的首选尺寸。。。