如何防止TableModel触发表更改事件?

时间:2014-12-18 01:43:38

标签: java swing events jtable

注意:这适用于绘图工具应用程序

我目前JTabletableChanged()个事件。

coFigureTable[i].getModel().addTableModelListener(
            new TableModelListener()
{
    public void tableChanged(TableModelEvent e)
    {
        coCanvas.userSetCoords(figIndex, angle, row, column);
    }
}

该表包含x和y坐标以及图形的角度。用户可以手动更改这些值。在coFigureTable中更改角度值时,“画布”中的图形将旋转。但是,当发生旋转时,必须在userSetCoords函数中的表中更新所有坐标。所以我打电话给repaint()表来更新值。这会触发表格更改事件,从而导致图形的移动等。因此,无限循环。

如果调用表已经完成一次,怎么能阻止调用表?或者是否有其他事件或算法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

您应该在更新内容时设置标记,以便TableModelListener 我知道要忽略这个事件。

boolean isUpdatingUI = false;

void initialise(){
  coFigureTable[i].getModel().addTableModelListener(
    new TableModelListener(){
        public void tableChanged(TableModelEvent e)    {
            if(!isUpdatingUI)
               coCanvas.userSetCoords(figIndex, angle, row, column);
        }
  }
}

public void doUpdate(){
   isUpdatingUI = true; 
   coFigureTable[i].getModel().setValue( ..... );  // update table
   isUpdatingUI = false;
}

该标志应该是一个类成员。

PS以paint方法更新数据不是一个好主意。

虽然理想情况下更新应该在GUI线程中进行,但是如果用户同时更改表,则不会忽略接口编辑。