此代码的问题是返回堆栈溢出,我不知道该如何处理。
问题是您的代码在模型侦听器中设置了一个值,因此生成了另一个tableChanged事件。您的代码应类似于:
if (e.getColumn() != 5) // do your pre
我没有看到使用TableModelListener来基于另一列中的数据动态设置列的值的问题。这是一个简单的示例:
import java.awt.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;public class TableProcessing extends Jframe implements TableModelListener{ JTable table; public TableProcessing() { super("Table"); String[] columnNames = {"Item", "Quantity", "Price", "Cost"}; Object[][] data = { {"Bread", new Integer(1), new Double(1.11), new Double(1.11)}, {"Milk", new Integer(1), new Double(2.22), new Double(2.22)}, {"Tea", new Integer(1), new Double(3.33), new Double(3.33)}, {"Cofee", new Integer(1), new Double(4.44), new Double(4.44)} }; DefaultTableModel model = new DefaultTableModel(data, columnNames); model.addTableModelListener( this );// table = new JTable( model ) { // Returning the Class of each column will allow different // renderers to be used based on Class public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } // The Cost is not editable public boolean isCellEditable(int row, int column) { int modelColumn = convertColumnIndexToModel( column ); return (modelColumn == 3) ? false : true; } }; table.setPreferredScrollableViewportSize(table.getPreferredSize());// JScrollPane scrollPane = new JScrollPane( table ); getContentPane().add( scrollPane ); String[] items = { "Bread", "Milk", "Tea", "Coffee" }; JComboBox editor = new JComboBox( items ); DefaultCellEditor dce = new DefaultCellEditor( editor ); table.getColumnModel().getColumn(0).setCellEditor(dce); } public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { int row = e.getFirstRow(); int column = e.getColumn(); if (column == 1 || column == 2) { TableModel model = table.getModel(); int quantity = ((Integer)model.getValueAt(row, 1)).intValue(); double price = ((Double)model.getValueAt(row, 2)).doublevalue(); Double value = new Double(quantity * price); model.setValueAt(value, row, 3); } } } public static void main(String[] args) { TableProcessing frame = new TableProcessing(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); }}


