package aliview.sequencelist;
/**
* This application demonstrates how one can squeeze some extra
* performance out of JList. A custom cell renderer is used - which
* only displays left justified strings - and the list is configured
* with fixed size cells. A simple benchmark measures the performance
* gained with this approach relative to a similarly configured
* JList with a default cell renderer. Tests on Solaris show
* about 30% improvement.
*
* Tested against swing-1.1, JDK1.1.7.
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.event.*;
import java.lang.reflect.Method;
/**
* A CellRenderer that eliminates any of the overhead that the
* DefaultListCellRenderer (a JLabel) adds. Only left justified
* strings are displayed, and cells have a fixed preferred
* height and width.
*/
class NotUsedTextCellRenderer extends JLabel implements ListCellRenderer
{
String text;
final int borderWidth = 1;
final int width;
final int height;
final BufferedImage buffImg = new BufferedImage(200, 20, BufferedImage.TYPE_INT_ARGB);
NotUsedTextCellRenderer(int width, int height, Font font) {
super();
this.height = height;
this.width = width;
this.setFont(font);
}
/**
* Return the renderers fixed size here.
*/
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
/**
* Completely bypass all of the standard JComponent painting machinery.
* This is a special case: the renderer is guaranteed to be opaque,
* it has no children, and it's only a child of the JList while
* it's being used to rubber stamp cells.
* <p>
* Clear the background and then draw the text.
*/
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
// This need to be off because I use exact font width in createAdjustedDerivedBaseFont
// g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// }
// g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
//g.setFont(this.getFont());
//g.setColor(getBackground());
//g.fillRect(0, 0, getWidth(), getHeight());
//g.setColor(getForeground());
g.drawImage(buffImg, 0,0, null);
// g.drawString(" ", borderWidth, getHeight());
//g.drawString(text, borderWidth, getHeight());
}
/* This is is the ListCellRenderer method. It just sets
* the foreground and background properties and updates the
* local text field.
*/
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
this.setFont(list.getFont());
text = value.toString();
return this;
}
}