cell顯示進度

/* (swing1.1) */
//package jp.gr.java_conf.tame.swing.examples;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import jp.gr.java_conf.tame.swing.table.*;

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

=================================================================
/* (swing1.1) */
package jp.gr.java_conf.tame.swing.table;

import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

/**
 * @version 1.0 03/03/99
 */
public 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 enum = limitColors.keys();
    while (enum.hasMoreElements()) {
      limitValues[i++] = ((Integer)enum.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;
    }
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章