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