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