我正在编写一个 Eclipse 插件,它可以打开一个文件并显示文件中包含的所有图像。此图像显示是 GUI 应用程序的一部分。通过将每个图像与 SWT Canvas 小部件相关联来呈现每个图像。当我打开文件时,我获得了确定要显示的图像数量所需的所有信息。我认为一个接一个地创建所有 Canvas 对象并将每个 Canvas 对象存储在某种类型的数组(如数据结构)中是有意义的。我打开的每个文件都有不同数量的图像要显示。我决定使用ArrayList
.
我进行如下操作:我为每个图像创建一个 Canvas 对象,并将所有 Canvas 对象存储在一个ArrayList
. 这就是问题所在:每个 Canvas 对象都有一个PaintListener
和MouseListener
与之关联 - 用于调整大小并检测图像是否已被“点击”。我在“for 循环”中创建所有 Canvas 对象 - 其中包括为每个 Canvas 对象分配一个PaintListener
和,如下所示:MouseListener
`
//
// Assume the following ArrayLists have been defined:
// myCanvases, myImages, and myFrames
//
for (int i = 0; i < numberOfImages; i++) {
canvas = new Canvas(getMyComposite(), SWT.BORDER |
SWT.NO_MERGE_PAINTS | SWT.NONE );
canvas.setLayoutData(getMyGridData());
.
.
.
canvas.addPaintListener(new PaintListener() {
public void paintControl(final PaintEvent event) {
if (myImages.get(i) != null) {
myImages.get(i).dispose();
event.gc.drawImage(mySceneImages.get(element), 0, 0);
}
}
});
currentCanvas.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent event) {
getVideo().setCurrentFrame(myFrames.get(i).getFrameNumber());
}
});
canvas.setVisible(true);
myCanvases.add(i, canvas);
} // End for (int i = 0; i < numberOfScenes; i++)
`
问题:变量 'i' 用于确定在PaintListener
and中的不同 ArrayLists 中访问哪个元素MouseListener
。请注意,我在这里使用“i”进行说明。我意识到在“for循环”中定义的变量“i”不能在监听器的内部类中使用。无论如何......当侦听器收到一个事件时,我用来尝试访问 ArrayList 的特定元素的任何变量都包含它的当前值,而不是定义侦听器时的值。
我怎样才能在 Java 中解决这个问题?我真正需要的是每个 Listener 定义中的代码,基本上相当于:
`
myCanvases.get(7); // or whatever the for loop iteration is for that specific object);
// Not
myCanvases.get(i); // - which will contain the present value of i;
`
当监听器执行时。
任何想法,将不胜感激。
谢谢。