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.
The code given below is short enough to understand quickly. You should probably subclass JTable rather than create an anonymous class as shown below.
Note that the listing below contains code from two files.
// File: Table.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class Table
{
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);
}
} );
// Create your own sub-class of JTable rather than using anonymous class
JTable table = new JTable( 15, 3 )
{
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer( renderer, row, column);
// We want renderer component to be transparent so background image is visible
if( c instanceof JComponent )
((JComponent)c).setOpaque(false);
return c;
}
};
// Use our version of JScrollPane
MyScrollPane sp = new MyScrollPane( table );
// Set the background image
ImageIcon image = new ImageIcon( "codeguruwm.gif" );
sp.setBackgroundImage( image );
frame.getContentPane().add( sp );
frame.pack();
frame.show();
}
}
// 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;
}
Improvement: In the paint code, you might want to get the clipRect and use that when tiling the image on the background.
Posted On: 16-Jan-1999