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

时间:2014-11-24 10:25:05

标签: java jtable tooltip tablecellrenderer

如何实现一个工具提示,当值太长时,会向我显示每个单元格的提示?

我只有一个表格渲染器,它为我设置一些单元格。所以我认为最简单的方法是在其中实现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;
      }

}

提前谢谢。

3 个答案:

答案 0 :(得分:0)

默认情况下,为表格单元格显示的工具提示文本由单元格的渲染器确定。但是,有时通过覆盖JTable的getToolTipText(MouseEvent)方法实现来指定工具提示文本会更简单,因此可以添加

setToolTipText(...);

getTableCellRendererComponent方法中,里面有真实的单元格值 所以你得到了

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

答案 1 :(得分:0)

首先覆盖getToolTipText(MouseEvent)的{​​{1}}事件。

JTable

获取给定鼠标位置的单元格坐标...

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

答案 2 :(得分:0)

解决方案:

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;

                   }
        };