Java 仅当列被切断时才在JTable中显示工具提示

Java 仅当列被切断时才在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,

当值太长时,如何实现为每个单元格显示提示的工具提示

我只有一个表格渲染器,它给我一些单元格着色。所以我认为最简单的方法就是在其中实现metod

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
,如果不合适,则返回工具提示值……请参见我的答案@madprogrammer
TableCellRenderer
将不知道调用
GetTableCellRenderComponent
JTable
的大小,它只会知道它的首选尺寸。。。