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