Scrollable Table Cell Renderer
/*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the license, or (at your option) any later version.
*/
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.Scrollable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
/**
A <tt>TableCellRenderer</tt> which is based on an <tt>ExtendedJLabel</tt> rather than
a <tt>JLabel</tt> like the <tt>javax.swing.table.DefaultTableCellRenderer</tt>.
@author <a href="mailto:jclasslib@ej-technologies.com">Ingo Kegel</a>
@version $Revision: 1.4 $ $Date: 2003/08/18 07:48:28 $
*/
public class ExtendedTableCellRenderer extends ExtendedJLabel
implements TableCellRenderer {
private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
private Color unselectedForeground;
private Color unselectedBackground;
/**
* Constructor.
*/
public ExtendedTableCellRenderer() {
super();
setOpaque(true);
setBorder(NO_FOCUS_BORDER);
}
public void setForeground(Color c) {
super.setForeground(c);
unselectedForeground = c;
}
public void setBackground(Color c) {
super.setBackground(c);
unselectedBackground = c;
}
public void updateUI() {
super.updateUI();
setForeground(null);
setBackground(null);
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
if (isSelected) {
super.setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
} else {
super.setForeground((unselectedForeground != null) ? unselectedForeground : table.getForeground());
super.setBackground((unselectedBackground != null) ? unselectedBackground : table.getBackground());
}
setFont(table.getFont());
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
if (table.isCellEditable(row, column)) {
super.setForeground(UIManager.getColor("Table.focusCellForeground"));
super.setBackground(UIManager.getColor("Table.focusCellBackground"));
}
} else {
setBorder(NO_FOCUS_BORDER);
}
setValue(value);
Color background = getBackground();
boolean colorMatch = (background != null) && (background.equals(table.getBackground())) && table.isOpaque();
setOpaque(!colorMatch);
return this;
}
public void validate() {}
public void revalidate() {}
public void repaint(long tm, int x, int y, int width, int height) {}
public void repaint(Rectangle r) { }
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
if (propertyName == "text") {
super.firePropertyChange(propertyName, oldValue, newValue);
}
}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { }
private void setValue(Object value) {
setText((value == null) ? "" : value.toString());
}
}
/*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the license, or (at your option) any later version.
*/
class ExtendedJLabel extends JLabel implements Scrollable {
private boolean underlined = false;
private boolean autoTooltip = false;
/**
Constructor.
*/
public ExtendedJLabel() {
}
/**
Constructor.
@param text the label text.
*/
public ExtendedJLabel(String text) {
super(text);
}
public Dimension getPreferredScrollableViewportSize() {
return getSize();
}
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return getWidth() / 10;
}
public boolean getScrollableTracksViewportWidth() {
return false;
}
public boolean getScrollableTracksViewportHeight() {
return false;
}
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 10;
}
/**
Check whether this label is underlined.
@return underlined or not
*/
public boolean isUnderlined() {
return underlined;
}
/**
Set whether this label is underlined.
@param underlined underlined or not
*/
public void setUnderlined(boolean underlined) {
this.underlined = underlined;
repaint();
}
/**
Check whether the tooltip text is automatically equal
to the text of this label or not.
@return equal or not
*/
public boolean getAutoTooltip() {
return autoTooltip;
}
/**
Set whether the tooltip text is automatically equal
to the text of this label or not.
@param autoTooltip equal or not
*/
public void setAutoTooltip(boolean autoTooltip) {
this.autoTooltip = autoTooltip;
setToolTipText(getText());
}
public void setText(String text) {
super.setText(text);
if (autoTooltip) {
setToolTipText(text);
}
}
/**
Convenience method for calling <tt>setText()</tt> with a <tt>short</tt>.
@param number the <tt>short</tt>
*/
public void setText(short number) {
setText(String.valueOf(number));
}
/**
Convenience method for calling <tt>setText()</tt> with a <tt>int</tt>.
@param number the <tt>int</tt>
*/
public void setText(int number) {
setText(String.valueOf(number));
}
/**
Convenience method for calling <tt>setText()</tt> with a <tt>double</tt>.
@param number the <tt>double</tt>
*/
public void setText(double number) {
setText(String.valueOf(number));
}
/**
Convenience method for calling <tt>setText()</tt> with a <tt>float</tt>.
@param number the <tt>float</tt>
*/
public void setText(float number) {
setText(String.valueOf(number));
}
/**
Convenience method for calling <tt>setText()</tt> with a <tt>long</tt>.
@param number the <tt>long</tt>
*/
public void setText(long number) {
setText(String.valueOf(number));
}
public void paint(Graphics g) {
super.paint(g);
if (underlined) {
Insets i = getInsets();
FontMetrics fm = g.getFontMetrics();
Rectangle textRect = new Rectangle();
Rectangle viewRect = new Rectangle(i.left, i.top, getWidth() - (i.right + i.left), getHeight() - (i.bottom + i.top) );
SwingUtilities.layoutCompoundLabel(
this,
fm,
getText(),
getIcon(),
getVerticalAlignment(),
getHorizontalAlignment(),
getVerticalTextPosition(),
getHorizontalTextPosition(),
viewRect,
new Rectangle(),
textRect,
getText() == null ? 0 : ((Integer)UIManager.get("Button.textIconGap")).intValue()
);
int offset = 2;
if (UIManager.getLookAndFeel().isNativeLookAndFeel() && System.getProperty("os.name").startsWith("Windows")) {
offset = 1;
}
g.fillRect(textRect.x + ((Integer)UIManager.get("Button.textShiftOffset")).intValue() ,
textRect.y + fm.getAscent() + ((Integer)UIManager.get("Button.textShiftOffset")).intValue() + offset,
textRect.width,
1);
}
}
}
Related examples in the same category