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:}