注意:这适用于绘图工具应用程序
我目前JTable
有tableChanged()
个事件。
coFigureTable[i].getModel().addTableModelListener(
new TableModelListener()
{
public void tableChanged(TableModelEvent e)
{
coCanvas.userSetCoords(figIndex, angle, row, column);
}
}
该表包含x和y坐标以及图形的角度。用户可以手动更改这些值。在coFigureTable
中更改角度值时,“画布”中的图形将旋转。但是,当发生旋转时,必须在userSetCoords
函数中的表中更新所有坐标。所以我打电话给repaint()
表来更新值。这会触发表格更改事件,从而导致图形的移动等。因此,无限循环。
如果调用表已经完成一次,怎么能阻止调用表?或者是否有其他事件或算法可以解决这个问题?
答案 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线程中进行,但是如果用户同时更改表,则不会忽略接口编辑。