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