参考http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
其中例子如下:
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;import javax.swing.DefaultCellEditor;import javax.swing.JScrollPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.awt.event.*;/**
 * This is exactly like TableDemo, except that it uses a
 * custom cell editor to validate integer input.
 */
public class TableEditDemo extends JFrame {
    private boolean DEBUG = true;    public TableEditDemo() {
        super("TableEditDemo");        MyTableModel myModel = new MyTableModel();
        JTable table = new JTable(myModel);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));        //Create the scroll pane and add the table to it. 
        JScrollPane scrollPane = new JScrollPane(table);        //Set up real input validation for the integer column.
        setUpIntegerEditor(table);        //Add the scroll pane to this window.
        getContentPane().add(scrollPane, BorderLayout.CENTER);        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }    private void setUpIntegerEditor(JTable table) {
        //Set up the editor for the integer cells.
        final WholeNumberField integerField = new WholeNumberField(0, 5);
        integerField.setHorizontalAlignment(WholeNumberField.RIGHT);        DefaultCellEditor integerEditor = 
            new DefaultCellEditor(integerField) {
                //Override DefaultCellEditor's getCellEditorValue method
                //to return an Integer, not a String:
                public Object getCellEditorValue() {
                    return new Integer(integerField.getValue());
                }
            };
        table.setDefaultEditor(Integer.class, integerEditor);
    }    class MyTableModel extends AbstractTableModel {
        final String[] columnNames = {"First Name", 
                                      "Last Name",
                                      "Sport",
                                      "# of Years",
                                      "Vegetarian"};
        final Object[][] data = {
            {"Mary", "Campione", 
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml", 
             "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
             "Chasing toddlers", new Integer(2), new Boolean(false)},
            {"Mark", "Andrews",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Angela", "Lih",
             "Teaching high school", new Integer(4), new Boolean(false)}
        };        public int getColumnCount() {
            return columnNames.length;
        }
        
        public int getRowCount() {
            return data.length;
        }        public String getColumnName(int col) {
            return columnNames[col];
        }        public Object getValueAt(int row, int col) {
            return data[row][col];
        }        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 2) { 
                return false;
            } else {
                return true;
            }
        }        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of " 
                                   + value.getClass() + ")");
            }            data[row][col] = value;
            fireTableCellUpdated(row, col);            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }    public static void main(String[] args) {
        TableEditDemo frame = new TableEditDemo();
        frame.pack();
        frame.setVisible(true);
    }
}import javax.swing.*; 
import javax.swing.text.*; import java.awt.Toolkit;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;public class WholeNumberField extends JTextField {
    private Toolkit toolkit;
    private NumberFormat integerFormatter;    public WholeNumberField(int value, int columns) {
        super(columns);
        toolkit = Toolkit.getDefaultToolkit();
        integerFormatter = NumberFormat.getNumberInstance(Locale.US);
        integerFormatter.setParseIntegerOnly(true);
        setValue(value);
    }    public int getValue() {
        int retVal = 0;
        try {
            retVal = integerFormatter.parse(getText()).intValue();
        } catch (ParseException e) {
            // This should never happen because insertString allows
            // only properly formatted data to get in the field.
            toolkit.beep();
        }
        return retVal;
    }    public void setValue(int value) {
        setText(integerFormatter.format(value));
    }    protected Document createDefaultModel() {
        return new WholeNumberDocument();
    }    protected class WholeNumberDocument extends PlainDocument {
        public void insertString(int offs, 
                                 String str,
                                 AttributeSet a) 
                throws BadLocationException {
            char[] source = str.toCharArray();
            char[] result = new char[source.length];
            int j = 0;            for (int i = 0; i < result.length; i++) {
                if (Character.isDigit(source[i]))
                    result[j++] = source[i];
                else {
                    toolkit.beep();
                    System.err.println("insertString: " + source[i]);
                }
            }
            super.insertString(offs, new String(result, 0, j), a);
        }
    }
}

解决方案 »

  1.   

    用如果方式来构造JTable的model,然后设置JTable的modelimport java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import java.util.*;
    import java.sql.*;public class EquipmentTableModel extends DefaultTableModel {
    boolean[] ColEditableVec;
    public EquipmentTableModel(Vector a,Vector b) {
    super(a,b);
    ColEditableVec = new boolean[b.size()];
    for(int i=0;i<b.size();i++)
    ColEditableVec[i]=true;
    }   
      
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return ColEditableVec[columnIndex];
    }
    public void setColumnEditable(int columnIndex,boolean editable) {
    if(columnIndex < 0 || columnIndex >= ColEditableVec.length) {
    System.out.println("error columnIndex !");
    return;
    }
    ColEditableVec[columnIndex]=editable;
    }
    public void setAllColEditable(boolean editable) {
    for(int i=0;i<ColEditableVec.length;i++)
    ColEditableVec[i] =  editable;
    }
    } //*/