ExtendedTableCellRenderer.java Source code

Java tutorial

Introduction

Here is the source code for ExtendedTableCellRenderer.java

Source

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