KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > snow > sortabletable > UniversalTableCellRenderer


1 package snow.sortabletable;
2
3 import javax.swing.table.*;
4 import javax.swing.*;
5 import javax.swing.border.*;
6 import java.awt.*;
7 import java.text.*;
8 import javax.swing.text.*;
9 import java.awt.font.*;
10 import java.awt.geom.*;
11 import java.nio.*;
12 import java.nio.charset.*;
13 import java.util.*;
14
15 /** alternative to DefaultTableCellRenderer
16 */

17 public final class UniversalTableCellRenderer implements TableCellRenderer
18 {
19   protected final DoubleRenderer doubleRenderer = new DoubleRenderer();
20   protected final StringRenderer stringRenderer = new StringRenderer();
21   protected final ColorRenderer colorRenderer = new ColorRenderer();
22   protected final BooleanRenderer booleanRenderer = new BooleanRenderer();
23
24   protected Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
25
26   protected final SortableTableModel sortableTableModel;
27
28
29   int fontSize = 10;
30
31   public UniversalTableCellRenderer()
32   {
33      this.sortableTableModel = null;
34   }
35
36   /** @param sortableTableModel is used to set column alignments (left, right)
37   */

38   public UniversalTableCellRenderer(SortableTableModel sortableTableModel)
39   {
40      setupUI();
41      this.sortableTableModel = sortableTableModel;
42   } // Constructor
43

44   /** must be called after each L&F changes
45   */

46   private void setupUI()
47   {
48      fontSize = UIManager.getFont("Table.font").getSize();
49      noFocusBorder = new EmptyBorder(fontSize/4, fontSize/4, fontSize/4, fontSize/4);
50
51      doubleRenderer.setupUI();
52      stringRenderer.setupUI();
53   }
54
55
56   public Component getTableCellRendererComponent(JTable table, Object JavaDoc value,
57      boolean isSelected, boolean hasFocus, int row, int column)
58   {
59     BasicRenderer comp = getRendererFor(value, column);
60
61
62     if(value instanceof Font)
63     {
64        Font font = (Font) value;
65        comp.setValue("Font "+font.getFontName()+", size="+font.getSize());
66        comp.setFont(font);
67     }
68     else
69     {
70        comp.setFont(table.getFont());
71        //comp.setFont(UIManager.getFont("Table.font"));
72
comp.setValue(value);
73     }
74
75     if(value instanceof Color)
76     {
77     }
78     else
79     {
80       if (isSelected)
81       {
82          //comp.setForeground(table.getSelectionForeground());
83
//comp.setBackground(table.getSelectionBackground());
84
comp.setForeground(UIManager.getColor("Table.selectionForeground"));
85          comp.setBackground(UIManager.getColor("Table.selectionBackground"));
86       }
87       else
88       {
89          //comp.setForeground(table.getForeground());
90
//comp.setBackground(table.getBackground());
91
comp.setForeground(UIManager.getColor("Table.foreground"));
92          comp.setBackground(UIManager.getColor("Table.background"));
93       }
94     }
95
96     return (Component) comp;
97   }
98
99
100   private BasicRenderer getRendererFor(Object JavaDoc value, int viewColumn)
101   {
102     if(value==null) return doubleRenderer;
103     if(value instanceof Double JavaDoc)
104     {
105       return doubleRenderer;
106     }
107     else if(value instanceof Color)
108     {
109       return this.colorRenderer;
110     }
111     else if(value instanceof Boolean JavaDoc)
112     {
113       return this.booleanRenderer;
114     }
115     else // String & defaults
116
{
117       if(sortableTableModel!=null)
118       {
119         int col = sortableTableModel.getColumnForViewIndex(viewColumn);
120         stringRenderer.setHorizontalAlignment(sortableTableModel.getBasicTableModel().getColumnAlignment(col));
121       }
122       return stringRenderer;
123     }
124   }
125
126
127   //
128
// Renderers
129
//
130

131   interface BasicRenderer
132   {
133      public void setValue(Object JavaDoc value);
134      public void setFont(Font f);
135      public void setForeground(Color c);
136      public void setBackground(Color c);
137   }
138
139
140   class DoubleRenderer extends JComponent implements BasicRenderer
141   {
142     String JavaDoc value = "";
143     DecimalFormat format = new DecimalFormat("#.###");
144     int posPoint = 80;
145     AffineTransform identityTransform = new AffineTransform();
146     FontRenderContext fontRenderContext = new FontRenderContext(identityTransform, false, false);
147     int posX = 0;
148
149     public DoubleRenderer()
150     {
151     }
152
153     public void setupUI()
154     {
155       setBorder(noFocusBorder);
156       setOpaque(true);
157     }
158
159     public void paintComponent(Graphics g)
160     {
161        // fill background and set foreground color.
162
Graphics2D g2 = (Graphics2D) g;
163        g.setColor(this.getBackground());
164        g2.fill(g.getClipBounds());
165        g.setColor(this.getForeground());
166
167
168        int fs = g.getFont().getSize();
169        int posY = (int) (this.getSize().getHeight()/2 + fs/2);
170
171        //fontRenderContext
172
//SwingUtilities.
173

174        g.drawString(value, posX, posY);
175     }
176
177     public void setValue(Object JavaDoc o)
178     {
179        value = format.format((Double JavaDoc) o);
180
181        int pos = value.indexOf(".");
182        if(pos<0) pos = value.length();
183        String JavaDoc beforePoint = value.substring(0,pos);
184        //System.out.println(""+beforePoint+" "+value);
185

186
187        TextLayout textLayout = new TextLayout(beforePoint, this.getFont(), fontRenderContext);
188        Rectangle2D bounds = textLayout.getBounds();
189        posX = posPoint - (int) bounds.getWidth();
190        if(posX<4) posX=4;
191
192     }
193   }
194
195 /* DOESN'T WORK !!!
196 *
197   class DoubleRenderer extends JTextField implements BasicRenderer
198   {
199      DecimalFormat format = new DecimalFormat("0.000");
200      DefaultStyledDocument document = new DefaultStyledDocument();
201      SimpleAttributeSet attributes;
202
203      public DoubleRenderer()
204      {
205        super();
206        setOpaque(true);
207
208        this.setEditable(false);
209        this.setDocument(document);
210
211        TabSet tabset = new TabSet(
212              new TabStop[]{
213                 new TabStop(160.2f, TabStop.ALIGN_DECIMAL, TabStop.LEAD_THICKLINE)
214              });
215        attributes = new SimpleAttributeSet();
216        StyleConstants.setTabSet(attributes, tabset);
217        StyleConstants.setForeground(attributes, Color.green);
218
219      }
220
221      public void setupUI()
222      {
223        setBorder(noFocusBorder);
224        setOpaque(true);
225      }
226
227      public void setValue(Object o)
228      {
229        if(o==null)
230        {
231          setText("ERROR: null");
232          //setText("");
233          return;
234        }
235
236        if(o instanceof Double)
237        {
238          double value = ((Double) o).doubleValue();
239          try
240          {
241            document.remove(0, document.getLength());
242            document.setParagraphAttributes(document.getLength(), 0, attributes, true);
243            document.insertString(document.getLength(), "\t"+format.format(value), attributes);
244          } catch(Exception e){ e.printStackTrace(); }
245          //setText("\t"+format.format(value));
246          return;
247        }
248
249        try
250        {
251          document.replace(0,document.getLength(), "Bad class "+o.getClass(), attributes);
252        } catch(Exception e){}
253
254      }
255   } */

256
257   class StringRenderer extends JLabel implements BasicRenderer
258   {
259      public StringRenderer()
260      {
261        super();
262        setOpaque(true);
263      }
264
265      public void setupUI()
266      {
267        setBorder(noFocusBorder);
268        setOpaque(true);
269      }
270
271      public void setValue(Object JavaDoc o)
272      {
273        setText(""+o);
274      }
275   }
276
277   class ColorRenderer extends JLabel implements BasicRenderer
278   {
279      public ColorRenderer()
280      {
281        super();
282        setOpaque(true);
283      }
284
285      public void setupUI()
286      {
287        setBorder(noFocusBorder);
288        setOpaque(true);
289      }
290
291      public void setValue(Object JavaDoc o)
292      {
293        this.setText("");
294        if(o==null)
295        {
296          this.setText("null");
297        }
298
299        if(o instanceof Color)
300        {
301          this.setBackground((Color) o);
302        }
303        else
304        {
305          this.setText("ERROR "+o.getClass().getName());
306        }
307      }
308   }
309
310   class BooleanRenderer extends JCheckBox implements BasicRenderer
311   {
312      public BooleanRenderer()
313      {
314        super();
315        setOpaque(true);
316      }
317
318      public void setupUI()
319      {
320        setBorder(noFocusBorder);
321        setOpaque(true);
322      }
323
324      public void setValue(Object JavaDoc o)
325      {
326        if(o instanceof Boolean JavaDoc)
327        {
328          this.setSelected( (Boolean JavaDoc) o);
329        }
330      }
331   }
332
333
334 } // UniversalTableCellRenderer
Popular Tags