JTable – > TableModeListener

我有这个JTable有一个DefaultTableModel作为它的模型。 在表格中,我有几个swing组件, JComboBoxJCheckBox ,通过DefaultCellEditorDefaultCellRenderer在特定列上设置。 TableModelListener已添加到表中以捕获可编辑列的更改。 其余列将显示所选组件的详细信息,即项目代码 – >项目价格,项目计数,项目分类等。

我有这个问题,其中如果JComboBox(itemCode)发生更改,则另一个JComboBox(itemClassification)更改。 但是随着其他JComboBox的更改,我需要在同一个表上显示商品价格。 此更改会重新生成valueChanged方法,该方法会生成valueChanged的无限循环。

我怎样才能摆脱无限循环的东西?

一种方法是检查更新事件以查看事件的列,并忽略自动更新的列:

 import java.awt.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; public class TableProcessing extends JFrame implements TableModelListener { 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 ); JTable 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); } /* * The cost is recalculated whenever the quantity or price is changed */ 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 = (TableModel)e.getSource(); 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); } } 

您可以在侦听器本身内部进行更改时删除侦听器,然后在完成更改后重新添加侦听器。 或者,您可以为Listener提供一个布尔属性,用于激活和取消激活侦听器代码,并在侦听器中对其进行适当设置。

其实……我也有答案。 我刚进入TableModelListener的API,我找到了TableModelEvent.getColumn()

多谢你们…