【问题标题】:StackOverflowError being caused by a TableModelListenerStackOverflowError 由 TableModelListener 引起
【发布时间】:2010-04-19 15:15:06
【问题描述】:

我不知道为什么这是递归的。

jTable1.getModel().addTableModelListener(new TableModelListener() {

 public void tableChanged(TableModelEvent evt) {
  int sum = 0;
  int i=0;
  for (i =0 ; i<2; i++){
   sum = sum + Integer.parseInt(jTable1.getValueAt(0, i).toString());
  }
  jTable1.setValueAt(sum, 0, 2);
 }

}); 

例外是:(不断重复)

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
        at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
        at javax.swing.JTable.convertColumnIndexToModel(JTable.java:2553)
        at javax.swing.JTable.getValueAt(JTable.java:2695)
        at testprogram.guitest.TestTableModel$1.tableChanged(TestTableModel.java:63)
        at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
        at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
        at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
        at javax.swing.JTable.setValueAt(JTable.java:2719)

任何帮助表示赞赏。

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    从事件处理程序(tableChanged 方法)包装您的代码,该代码使用 setValue 方法和删除和添加侦听器的代码,如下所示

    public void tableChanged(TableModelEvent e) {
    model.removeTableModelListener(this);
    // YOUR CODE WITH setValueAt calls begins here
    if (ppt == null || cantidad > ppt.getStock()) {
    
    model.setValueAt(ppt != null ? ppt.getStock() : 0, e.getFirstRow(), 3);
    }
    
    model.setValueAt(precioUnitario * cantidad, e.getFirstRow(), 4);
    
    // YOUR CODE with setValueAt calls ends here
    model.addTableModelListener(this);
    }
    

    这将在您进行验证时暂时禁用监听器。

    【讨论】:

    • 哇,这就像魔术一样。这应该是公认的答案。
    【解决方案2】:

    JTable.setValueAt 会触发一个 tablechanged 事件,因此您在事件处理程序中重复调用事件处理程序。在模型中设置值,而不是在表格中。

    【讨论】:

    • 我知道这是旧的,但想指出这并不能解决问题,因为无论使用表的 setValueAt 方法还是模型的 setValueAt 方法,表模型都会改变。 @jaime 的答案至少应该是一个公认的答案。
    【解决方案3】:

    您正在更新事件处理程序中的值以进行更新。这自然会触发再次调用事件处理程序。这将触发事件处理程序再次被调用,等等。

    您可能需要在进行更新之前删除侦听器。

    【讨论】:

      【解决方案4】:

      我之前在使用jlist 时遇到了同样的问题。我的解决方案是简单地更改代码行的顺序。

      1. 获取所有有图片的jpanels。
      2. 在将object[] 添加到jlist 之前添加一个侦听器

      我之前遇到的问题(创建stack-overflow error 是首先将侦听器添加到jlist然后获取所有带有图像的jpanels。

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 2022-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多