Click to See Complete Forum and Search --> : tool tips not working with MultiLineHeaderRenderer


Roque Oliveira
February 14th, 1999, 07:15 PM
// Hello Swingers!

// The MultiLineHeaderRenderer class worked as in the example in

// http://www.codeguru.com/java/articles/126.shtml

// However, when I tried to add tool tips to the header row of a JTable

// all cells end up with the same tool tip.

// Any ideas ?

// Full code is included below.

// Thanks.

//

// Roque


import java.io.*;

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import com.sun.java.swing.*;

import com.sun.java.swing.table.*;

//import javax.swing.*;

//import javax.swing.table.*;

//import jp.gr.java_conf.tame.swing.table.*;



/**

* @version 1.0 11/09/98

*/

public class MultiLineHeaderRendererDemo extends JFrame

{

MultiLineHeaderRendererDemo()

{

super( "Multi-Line Header Example" );


DefaultTableModel dm = new DefaultTableModel();

dm.setDataVector(new Object[][]{{"a","b","c"},

{"A","B","C"}},

new Object[]{"1st\nalpha\n one more",

"2nd\nbeta",

"3rd\ngamma"});



JTable table = new JTable( dm );



MultiLineHeaderRenderer renderer = new MultiLineHeaderRenderer();

Enumeration enum = table.getColumnModel().getColumns();

while (enum.hasMoreElements())

{

((TableColumn)enum.nextElement()).setHeaderRenderer(renderer);

}



String[] toolTips = {"a tooltip","b tooltip","c tooltip"}; // added by roque

// There is problem here : the tool tips are not being

// assigned on an individual basis.

setupToolTips(table, toolTips); // added by roque



JScrollPane scroll = new JScrollPane( table );

getContentPane().add( scroll );

setSize( 400, 110 );

setVisible(true);

}


public static void setupToolTips(JTable table, String[] toolTips)

{

// Sanity check

if (table == null || toolTips == null) return;


TableColumnModel columnModel = table.getColumnModel();

int numberOfColumns = columnModel.getColumnCount();


// Sanity check

if (numberOfColumns != toolTips.length) return;


TableColumn column = null;

TableCellRenderer headerRenderer = null;


for (int i = 0; i < numberOfColumns; i++)

{

column = columnModel.getColumn(i);

headerRenderer = column.getHeaderRenderer();

if (headerRenderer instanceof DefaultTableCellRenderer)

{

((DefaultTableCellRenderer)headerRenderer).setToolTipText(toolTips[i]);

}

else if (headerRenderer instanceof MultiLineHeaderRenderer)

{

System.out.println("Tool tip for column["+i+"] = \"" + toolTips[i] + "\"");

((MultiLineHeaderRenderer)headerRenderer).setToolTipText(toolTips[i]);

}

}

}



public static void main(String[] args)

{

MultiLineHeaderRendererDemo frame = new MultiLineHeaderRendererDemo();

frame.addWindowListener( new WindowAdapter()

{

public void windowClosing( WindowEvent e )

{

System.exit(0);

}

});

}

}



/**

* A class for rendering multi-line headers in a JTable.

* @version 1.0 11/09/98

* @see http://www.codeguru.com/java/articles/126.shtml

*/

//public

class MultiLineHeaderRenderer extends JList

implements TableCellRenderer, Serializable

{

/**

* Creates a multi-line cell renderer for the header row of a JTable.

*/

public MultiLineHeaderRenderer()

{

setOpaque(true);

setForeground(UIManager.getColor("TableHeader.foreground"));

setBackground(UIManager.getColor("TableHeader.background"));

setBorder(UIManager.getBorder("TableHeader.cellBorder"));

ListCellRenderer renderer = getCellRenderer();

((JLabel)renderer).setHorizontalAlignment(JLabel.CENTER);

setCellRenderer(renderer);

}


/**

* This method is sent to the renderer by the drawing table to

* configure the renderer appropriately before drawing.

*

* @param table The JTable that is asking the renderer to draw.

* This parameter can be null.

* @param value The value of the cell to be rendered. It is

* up to the specific renderer to interpret

* and draw the value. eg. if value is the

* String "true", it could be rendered as a

* string or it could be rendered as a check

* box that is checked. null is a valid value.

* @param isSelected true is the cell is to be renderered with

* selection highlighting.

* @param isFocused true is the cell has focus.

* @param row The row index of the cell being drawn. When

* drawing the header the rowIndex is -1.

* @param column The column index of the cell being drawn.

* @return The Component used for drawing.

*/

public Component getTableCellRendererComponent(JTable table, Object value,

boolean isSelected, boolean hasFocus,

int row, int column)

{

setFont(table.getFont());

String str = (value == null) ? "" : value.toString();

BufferedReader br = new BufferedReader(new StringReader(str));

String line;

Vector v = new Vector();

try

{

while ((line = br.readLine()) != null)

{

v.addElement(line);

}

}

catch (IOException ex)

{

ex.printStackTrace();

}

setListData(v);

return this;

}

}