您实现
setValueAt()您
AbstractTableModel不能开火,将通知该改变侦听器的事件:
@Overridepublic void setValueAt(Object value, int row, int column) { rowData[row][column] = value; fireTableCellUpdated(row, column);}纠正后,a
TableModelListener将看到每个更改。尝试注释掉该
fireTableCellUpdated()行以查看区别。
此外:
只能 在事件分配线程上构造和操作Swing GUI对象。
避免
set(Preferred|Maximum|Minimum)Size
在Java Swing中使用方法;setPreferredScrollableViewportSize()
危险性稍差一些。
码:
import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.EventQueue;import javax.swing.Jframe;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.event.TableModelEvent;import javax.swing.event.TableModelListener;import javax.swing.table.AbstractTableModel;import javax.swing.table.TableModel;public class EditableColorColumn { public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new EditableColorColumn().display(); } }); } private void display() { Jframe frame = new Jframe("Editable Color Table"); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); final TableModel model = new ColorTableModel(); JTable table = new JTable(model); table.setPreferredScrollableViewportSize(new Dimension(400, 150)); table.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { System.out.println(model.getValueAt(e.getFirstRow(), 0) + " " + model.getValueAt(e.getFirstRow(), 1)); } }); frame.add(new JScrollPane(table), BorderLayout.CENTER); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } private static class ColorTableModel extends AbstractTableModel { String columnNames[] = {"English", "Boolean"}; Object rowData[][] = { {"value1", Boolean.FALSE}, {"value2", Boolean.TRUE}, {"value3", Boolean.FALSE}, {"value4", Boolean.TRUE}, {"value5", Boolean.FALSE},}; @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public int getRowCount() { return rowData.length; } @Override public Object getValueAt(int row, int column) { return rowData[row][column]; } @Override public Class getColumnClass(int column) { return (getValueAt(0, column).getClass()); } @Override public void setValueAt(Object value, int row, int column) { rowData[row][column] = value; fireTableCellUpdated(row, column); } @Override public boolean isCellEditable(int row, int column) { return (column != 0); } }}


