Author: Zafir Anjum
Add a background image. You can use this to display your company logo or in a trialware. The background image does not scroll when table is scrolled.
Note that the listing below contains code from two files. It is important that you use your own TreeCellRenderer. The DefaultTreeCellRender does not render the cell transparently.
// File: Tree.java
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class Tree
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Table");
frame.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
Window win = e.getWindow();
win.setVisible(false);
win.dispose();
System.exit(0);
}
} );
JTree tree = new JTree();
// Set the tree transparent so we can see the background image
tree.setOpaque( false );
tree.setCellRenderer( new MyCellRenderer() );
// Use our version of JScrollPane
MyScrollPane sp = new MyScrollPane( tree );
// Set the background image
ImageIcon image = new ImageIcon( "codeguruwm.gif" );
sp.setBackgroundImage( image );
frame.getContentPane().add( sp );
frame.pack();
frame.show();
}
}
class MyCellRenderer extends JLabel implements TreeCellRenderer
{
public MyCellRenderer()
{
setOpaque(false);
setBackground(null);
}
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus)
{
setFont(tree.getFont());
String stringValue = tree.convertValueToText(value, sel,
expanded, leaf, row, hasFocus);
setEnabled(tree.isEnabled());
setText(stringValue);
if(sel)
setForeground(Color.blue);
else
setForeground(Color.black);
if (leaf) {
setIcon(UIManager.getIcon("Tree.leafIcon"));
} else if (expanded) {
setIcon(UIManager.getIcon("Tree.openIcon"));
} else {
setIcon(UIManager.getIcon("Tree.closedIcon"));
}
return this;
}
}
// File: MyScrollPane.java
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.metal.*;
import com.sun.java.swing.plaf.motif.*;
import com.sun.java.swing.plaf.windows.*;
class MyScrollPane extends JScrollPane
{
public MyScrollPane(Component view, int vsbPolicy, int hsbPolicy)
{
super( view, vsbPolicy, hsbPolicy );
// Set the component to transparent
if( view instanceof JComponent )
((JComponent)view).setOpaque(false);
}
public MyScrollPane(Component view)
{
this(view, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
public MyScrollPane(int vsbPolicy, int hsbPolicy)
{
this(null, vsbPolicy, hsbPolicy);
}
public MyScrollPane()
{
this(null, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
public void paint(Graphics g)
{
if( image != null )
{
// Draw the background image
Rectangle d = getViewport().getViewRect();
for( int x = 0; x < d.width; x += image.getIconWidth() )
for( int y = 0; y < d.height; y += image.getIconHeight() )
g.drawImage( image.getImage(), x, y, null, null );
// Do not use cached image for scrolling
getViewport().setBackingStoreEnabled(false);
}
super.paint( g );
}
public void setBackgroundImage( ImageIcon image )
{
this.image = image;
}
ImageIcon image = null;
}
Posted On: 17-Jan-1999