001:import java.awt.BorderLayout;
002:import java.awt.event.ActionEvent;
003:import java.awt.event.ActionListener;
004:import java.io.BufferedReader;
005:import java.io.File;
006:import java.io.FileNotFoundException;
007:import java.io.FileReader;
008:import java.io.IOException;
009:import java.util.StringTokenizer;
010:import java.text.NumberFormat;
011:
012:import javax.swing.JFileChooser;
013:import javax.swing.JFrame;
014:import javax.swing.JLabel;
015:import javax.swing.JMenu;
016:import javax.swing.JMenuBar;
017:import javax.swing.JMenuItem;
018:import javax.swing.JScrollPane;
019:import javax.swing.JTable;
020:import javax.swing.WindowConstants;
021:import javax.swing.SwingConstants;
022:import javax.swing.filechooser.FileFilter;
023:import javax.swing.table.AbstractTableModel;
024:import javax.swing.table.DefaultTableCellRenderer;
025:import javax.swing.table.TableCellRenderer;
026:import javax.swing.table.TableModel;
027:
028:class DoubleData extends AbstractTableModel {
029:    double[][] data = new double[0][0];
030:    BufferedReader reader = null;
031:    NumberFormat formatter = NumberFormat.getInstance();
032:
033:    DoubleData() {
034:        formatter.setMinimumIntegerDigits(1);
035:        formatter.setMinimumFractionDigits(3);
036:    }
037:
038:    public int getRowCount()    { return data.length; }
039:    public int getColumnCount() { 
040:        if(data.length==0) return 0;
041:        else               return data[0].length;
042:    }
043:    public Object getValueAt(int row, int col) { 
044:        String value = formatter.format(data[row][col]);
045:        return (Object)value;
046:    }
047:    public void setValueAt(Object value, int row, int col) {
048:        try {
049:        data[row][col] = Double.parseDouble(((String)value).trim());
050:        fireTableCellUpdated(row, col);
051:        } catch(NumberFormatException e) {}
052:    }
053:    public String read(File file) {
054:        try {
055:            reader = new BufferedReader(new FileReader(file));
056:            int i = 0;
057:            double[][] tempRows = new double[10000][];
058:            double[] tempCols = new double[100];
059:            while(true) {
060:                String line = reader.readLine();
061:                if(line==null) break;
062:                StringTokenizer t = new StringTokenizer(line, ",");
063:                int j = 0;
064:                while(t.hasMoreTokens()) {
065:                    tempCols[j++] = Double.parseDouble(((String)(t.nextToken())).trim());
066:                }
067:                double[] newRow = new double[j];
068:                for(int k=0; k<j; k++) newRow[k] = tempCols[k];
069:                tempRows[i++] = newRow;
070:            }
071:            double[][] newData = new double[i][];
072:            for(int k=0; k<i; k++) newData[k] = tempRows[k];
073:            int x = newData[0].length;
074:            for(int k=1; k<newData.length; k++) {
075:                if(x!=newData[k].length) return "data error at line " + (k+1);
076:            }
077:            data = newData;
078:            fireTableStructureChanged();
079:            reader.close();
080:        } catch (FileNotFoundException e) {
081:            return e.getMessage();
082:        } catch (IOException e) {
083:            return e.getMessage();
084:        }
085:        return file.getAbsolutePath();
086:    }
087:}
088:
089:class CellRendererRJ extends DefaultTableCellRenderer {
090:    CellRendererRJ() {
091:        setHorizontalAlignment(SwingConstants.RIGHT);
092:    }
093:}
094:
095:class DoubleDataTable extends JTable {
096:    DoubleDataTable(TableModel tm) {
097:        super(tm);
098:    }
099:    
100://  @Override
101:    public TableCellRenderer getCellRenderer(int row, int col) {
102:        return new CellRendererRJ();
103:    }
104:}
105:
106:class DataControl extends JMenuBar
107:                  implements ActionListener {
108:    DoubleData dataModel = new DoubleData();
109:    DoubleDataTable table = new DoubleDataTable(dataModel);
110:    JMenuItem menuOpen = new JMenuItem( "open" );
111:    JLabel statusLabel = new JLabel();
112:    File file = new File( "." );;
113:    
114:    DataControl() {
115:        JMenu menuF = new JMenu( "file" );
116:        add( menuF );
117:        menuOpen.addActionListener( this );
118:        menuF.add( menuOpen );
119:    }
120:
121:    public void actionPerformed(ActionEvent e) {
122:        Object source = e.getSource();
123:        if(source==menuOpen) {
124:            JFileChooser chooser = new JFileChooser(file);
125:            chooser.setFileFilter(new FileFilter() {
126:                public boolean accept(File f) {
127:                    String name = f.getName();
128:                    int x = name.lastIndexOf('.');
129:                    if(x<0) return false;
130:                    if(name.substring(x).equalsIgnoreCase(".txt")) return true;
131:                    return false;
132:                }
133:                public String getDescription() {
134:                    return "txt";
135:                }
136:            });
137:            int selected = chooser.showOpenDialog(this);
138:             if(selected == JFileChooser.APPROVE_OPTION) {
139:                 file = chooser.getSelectedFile();
140:                String status = dataModel.read(file);
141:                statusLabel.setText(status);
142:             }
143:        }
144:    }
145:}
146:
147:
148:public class JTableDemo4 {
149:
150:    public static void main(String[] args) {
151:        JFrame frame = new JFrame();
152:        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
153:
154:        DataControl control = new DataControl();
155:        frame.setJMenuBar( control );
156:
157:        JScrollPane scrollpane = new JScrollPane(control.table);
158:        frame.getContentPane().add(scrollpane, BorderLayout.CENTER);
159:        frame.getContentPane().add(control.statusLabel, BorderLayout.SOUTH);
160:        
161:        frame.pack();
162:        frame.setVisible(true);
163:    }
164:}