在循环中调用SwingUtilities.invokeAndWait

时间:2014-04-21 16:19:56

标签: java swing plot synchronization

我正在尝试保存JFrame的.PNG图像。在JFrame中,我有两个Plot3DPanel对象。很可能是因为同步故障,在保存.PNG时,左侧框架是不可见的。

enter image description here

因此,我使用以下代码:

try
{
    SwingUtilities.invokeAndWait(new Runnable() {
        public void run() {
            new VisualSerializer(P[i], Q[i], folder + "C" + i).run();
        }
    });

    serialize(P[i], folder + "P" + i);
    serialize(Q[i], folder + "P" + i);

}
catch(Exception e)
{
    e.printStackTrace();
}

但现在,我收到编译错误

  

不能在定义的内部类中引用非final变量i   用另一种方法

然而,我需要我的文件名不同。此外,我需要遍历我的对象数组。我该怎么做才能防止出现此错误?

3 个答案:

答案 0 :(得分:2)

一种方法是制作需要传递到匿名内部类的任何变量的最终副本,例如i是问题:

final int index = i;
SwingUtilities.invokeAndWait(new Runnable() {
    public void run() {
        new VisualSerializer(P[index], Q[index], folder + "C" + index).run();
    }
});

另一种解决方案是在匿名内部类中使用类字段。

答案 1 :(得分:1)

您有两个选择:

  1. 声明一个新的最终变量,将其初始化为您想要的变量,然后使用副本作为Hovercraft Full Of Eels说

  2. 使您的变量成为字段变量。字段变量不需要是最终的,以便在匿名类中使用。

答案 2 :(得分:0)

来自OP的

解决方案。

发现了错误! 这是正确的修改:

final int index = i;
SwingUtilities.invokeAndWait
(
       new VisualSerializer(P[index], Q[index], folder + "C" + index)
);

新的Runnable是多余的。该类已经是Runnable的类型。