# 'Spezieller' Tooltip, wenn JTable-Column zu schmal



## Gast (7. Feb 2008)

Ich möchte eine Art Tooltip über ein JTable-Header erscheinen lassen.

Wenn die Maus über den Header fährt, soll ein Tolltip genau über der Überschrift des Column erscheinen, der dann die gesamte Überschrift darstellt, wenn die Column dafür zu schmal ist und der in ihr befindliche Text 'abgeschnitten' wurde.


----------



## André Uhres (8. Feb 2008)

```
...
        ToolTipHeader header = new ToolTipHeader(table.getColumnModel());
        table.setTableHeader(header);
...
class ToolTipHeader extends JTableHeader {
    private final static Point NO_TIP = new Point(-2, -2);
    private Point toolTipLocation = NO_TIP;
    private HeaderRenderer renderer;

    public ToolTipHeader(final TableColumnModel model) {
        super(model);
        renderer = new HeaderRenderer();
        setDefaultRenderer(renderer);
    }

    public Point getToolTipLocation(final MouseEvent event) {
        return toolTipLocation;
    }

    public String getToolTipText(final MouseEvent event) {
        int column = columnModel.getColumnIndexAtX(event.getX());
        TableColumn aColumn = columnModel.getColumn(column);
        String tip = "";
        toolTipLocation = NO_TIP;
        Rectangle headerRect = getHeaderRect(column);
        JLabel label = (JLabel) renderer.getTableCellRendererComponent(
                getTable(), aColumn.getHeaderValue(), false, false, -1, column);
        if (headerRect.width <= label.getPreferredSize().width) {
            tip = aColumn.getHeaderValue().toString();
            toolTipLocation = headerRect.getLocation();
        }
        return tip;
    }

    class HeaderRenderer extends JLabel implements TableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            setText(value.toString());
            setFont(table.getFont());
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
            setHorizontalAlignment(SwingConstants.CENTER);
            return this;
        }
    }
}
```


----------



## Gast (8. Feb 2008)

einfach Klasse, wirklich cool. Danke.


----------



## kingston (17. Mrz 2008)

das ist wirklich genial,
kann man das auch mit den einzelnen zellen der Tabelle machen?


----------



## André Uhres (17. Mrz 2008)

kingston hat gesagt.:
			
		

> ..kann man das auch mit den einzelnen zellen der Tabelle machen?


Hier ist eine Möglichkeit:

```
JTable table = new JTable() {
            private final Point NO_TIP = new Point(-2, -2); 
            private Point toolTipLocation = NO_TIP;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                JComponent c = (JComponent)super.prepareRenderer(renderer, row, column);
                String tip = "";
                toolTipLocation = NO_TIP; 
                Rectangle cellRect = getCellRect(row, column, true);
                if (cellRect.width <= c.getPreferredSize().width) {
                    tip = getValueAt(row, column).toString();
                    toolTipLocation = cellRect.getLocation();
                }
                setToolTipText(tip);
                return c;
            }

            @Override
            public Point getToolTipLocation(MouseEvent event) {
                return toolTipLocation;
            }
        };
```


----------



## kingston (21. Mrz 2008)

very smart, very smart


----------



## kameit00 (11. Aug 2010)

Hallo,

das Thema ist schon etwas älter, aber ich konnte es gerade gut gebrauchen. Deshalb schreibe ich hier nochmal etwas dazu.

Ich habe den Code von André für mich angepasst, um ihn bequem anwenden zu können und habe ihn erweitert, so dass das Look&Feel der original Header der Tabelle benutzt wird. 

An dieser Stelle nochmal vielen Dank an André für den Code!

Aufruf:

```
JTable table = new JTable();
TooltipHeaders.install(table);
```

Hier die Klasse:

```
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

/**
 * Tooltip on <code>JTable</code> columns.
 */

public class TooltipHeaders {

	/**
	 * JTableHeader implementation.
	 */
	@SuppressWarnings("serial")
	static class ToolTipHeader extends JTableHeader {

		/** Invisible location */
		private final static Point NO_TIP = new Point(-2, -2);

		/** Renderer of the original table, used as delegate */
		private final TableCellRenderer delegateRenderer;

		/** Tooltip location */
		private Point toolTipLocation;

		/**
		 * Constructor.
		 * 
		 * @param jtable
		 *            The table.
		 */
		ToolTipHeader(final JTable jtable) {
			super(jtable.getColumnModel());
			toolTipLocation = NO_TIP;
			delegateRenderer = jtable.getTableHeader().getDefaultRenderer();
			setDefaultRenderer(delegateRenderer);
		}

		/*
		 * (non-Javadoc)
		 * @see javax.swing.JComponent#getToolTipLocation(java.awt.event.MouseEvent)
		 */
		public Point getToolTipLocation(final MouseEvent event) {
			return toolTipLocation;
		}

		/*
		 * (non-Javadoc)
		 * @see javax.swing.table.JTableHeader#getToolTipText(java.awt.event.MouseEvent)
		 */
		public String getToolTipText(final MouseEvent event) {
			final int currentColumnIndex = columnModel.getColumnIndexAtX(event.getX());
			final Rectangle headerRect = getHeaderRect(currentColumnIndex);
			final TableColumn currentColumn = columnModel.getColumn(currentColumnIndex);
			final Object currentColumnHeader = currentColumn.getHeaderValue();
			final JLabel columnHeaderLabel = (JLabel) delegateRenderer.getTableCellRendererComponent(getTable(),
					currentColumnHeader, false, false, -1, currentColumnIndex);
			toolTipLocation = NO_TIP;
			String tip = "";
			// If string doesn't fit in column header
			if (headerRect.width <= columnHeaderLabel.getPreferredSize().width) {
				tip = currentColumnHeader.toString();
				toolTipLocation = headerRect.getLocation();
			}
			return tip;
		}
	}

	/**
	 * Install the <code>TooltipHeader</code> on the <code>JTable</code>.
	 * 
	 * @param table
	 *            The <code>JTable</code>.
	 */
	public static void install(JTable table) {
		table.setTableHeader(new ToolTipHeader(table));
	}
}
```


----------

