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 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 38 public UniversalTableCellRenderer(SortableTableModel sortableTableModel) 39 { 40 setupUI(); 41 this.sortableTableModel = sortableTableModel; 42 } 44 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 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.setValue(value); 73 } 74 75 if(value instanceof Color) 76 { 77 } 78 else 79 { 80 if (isSelected) 81 { 82 comp.setForeground(UIManager.getColor("Table.selectionForeground")); 85 comp.setBackground(UIManager.getColor("Table.selectionBackground")); 86 } 87 else 88 { 89 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 value, int viewColumn) 101 { 102 if(value==null) return doubleRenderer; 103 if(value instanceof Double ) 104 { 105 return doubleRenderer; 106 } 107 else if(value instanceof Color) 108 { 109 return this.colorRenderer; 110 } 111 else if(value instanceof Boolean ) 112 { 113 return this.booleanRenderer; 114 } 115 else { 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 131 interface BasicRenderer 132 { 133 public void setValue(Object 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 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 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 174 g.drawString(value, posX, posY); 175 } 176 177 public void setValue(Object o) 178 { 179 value = format.format((Double ) o); 180 181 int pos = value.indexOf("."); 182 if(pos<0) pos = value.length(); 183 String beforePoint = value.substring(0,pos); 184 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 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 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 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 o) 325 { 326 if(o instanceof Boolean ) 327 { 328 this.setSelected( (Boolean ) o); 329 } 330 } 331 } 332 333 334 } | Popular Tags |