Mega Code Archive

 
Categories / Java / Swing Components
 

Indicator Table Example

// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html /* (swing1.1) */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Enumeration; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; /**  * @version 1.0 03/03/99  */ public class IndicatorTableExample extends JPanel {   private static final int MAX = 100;   private static final int MIN = 0;   public IndicatorTableExample() {     setLayout(new BorderLayout());     DefaultTableModel dm = new DefaultTableModel() {       public Class getColumnClass(int col) {         switch (col) {         case 0:           return String.class;         case 1:           return Integer.class;         case 2:           return Integer.class;         default:           return Object.class;         }       }       public boolean isCellEditable(int row, int col) {         switch (col) {         case 2:           return false;         default:           return true;         }       }       public void setValueAt(Object obj, int row, int col) {         if (col != 1) {           super.setValueAt(obj, row, col);           return;         }         try {           Integer integer = new Integer(obj.toString());           super.setValueAt(checkMinMax(integer), row, col);         } catch (NumberFormatException ex) {           ex.printStackTrace();         }       }     };     dm.setDataVector(new Object[][] {         { "not human", new Integer(100), new Integer(100) },         { "hard worker", new Integer(76), new Integer(76) },         { "ordinary guy", new Integer(51), new Integer(51) },         { "lazy fellow", new Integer(12), new Integer(12) } },         new Object[] { "Name", "Result", "Indicator" });     JTable table = new JTable(dm);     IndicatorCellRenderer renderer = new IndicatorCellRenderer(MIN, MAX);     renderer.setStringPainted(true);     renderer.setBackground(table.getBackground());     // set limit value and fill color     Hashtable limitColors = new Hashtable();     limitColors.put(new Integer(0), Color.green);     limitColors.put(new Integer(60), Color.yellow);     limitColors.put(new Integer(80), Color.red);     renderer.setLimits(limitColors);     table.getColumnModel().getColumn(2).setCellRenderer(renderer);     table.getModel().addTableModelListener(new TableModelListener() {       public void tableChanged(TableModelEvent e) {         if (e.getType() == TableModelEvent.UPDATE) {           int col = e.getColumn();           if (col == 1) {             int row = e.getFirstRow();             TableModel model = (TableModel) e.getSource();             Integer value = (Integer) model.getValueAt(row, col);             model.setValueAt(checkMinMax(value), row, ++col);           }         }       }     });     JScrollPane pane = new JScrollPane(table);     add(pane, BorderLayout.CENTER);   }   public static void main(String[] args) {     JFrame f = new JFrame("IndicatorTable Example");     f.getContentPane()         .add(new IndicatorTableExample(), BorderLayout.CENTER);     f.setSize(400, 120);     f.setVisible(true);     f.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });   }   private Integer checkMinMax(Integer value) {     int intValue = value.intValue();     if (intValue < MIN) {       intValue = MIN;     } else if (MAX < intValue) {       intValue = MAX;     }     return new Integer(intValue);   } } /**  * @version 1.0 03/03/99  */ class IndicatorCellRenderer extends JProgressBar implements TableCellRenderer {   private Hashtable limitColors;   private int[] limitValues;   public IndicatorCellRenderer() {     super(JProgressBar.HORIZONTAL);     setBorderPainted(false);   }   public IndicatorCellRenderer(int min, int max) {     super(JProgressBar.HORIZONTAL, min, max);     setBorderPainted(false);   }   public Component getTableCellRendererComponent(JTable table, Object value,       boolean isSelected, boolean hasFocus, int row, int column) {     int n = 0;     if (!(value instanceof Number)) {       String str;       if (value instanceof String) {         str = (String) value;       } else {         str = value.toString();       }       try {         n = Integer.valueOf(str).intValue();       } catch (NumberFormatException ex) {       }     } else {       n = ((Number) value).intValue();     }     Color color = getColor(n);     if (color != null) {       setForeground(color);     }     setValue(n);     return this;   }   public void setLimits(Hashtable limitColors) {     this.limitColors = limitColors;     int i = 0;     int n = limitColors.size();     limitValues = new int[n];     Enumeration e = limitColors.keys();     while (e.hasMoreElements()) {       limitValues[i++] = ((Integer) e.nextElement()).intValue();     }     sort(limitValues);   }   private Color getColor(int value) {     Color color = null;     if (limitValues != null) {       int i;       for (i = 0; i < limitValues.length; i++) {         if (limitValues[i] < value) {           color = (Color) limitColors               .get(new Integer(limitValues[i]));         }       }     }     return color;   }   private void sort(int[] a) {     int n = a.length;     for (int i = 0; i < n - 1; i++) {       int k = i;       for (int j = i + 1; j < n; j++) {         if (a[j] < a[k]) {           k = j;         }       }       int tmp = a[i];       a[i] = a[k];       a[k] = tmp;     }   } }