我正在编写一个 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
和 MouseListener
中不同 ArrayList 中的哪个元素。请注意,我在这里使用“i”是为了说明目的。我意识到“for 循环”中定义的变量“i”不能在监听器的内部类中使用。无论如何......当监听器接收到事件时,无论我使用什么变量来尝试访问 ArrayList 的特定元素都包含它的当前值,而不是定义监听器时的值。
如何在 Java 中解决这个问题?我真正需要的是每个监听器定义中的代码,本质上等于:
`
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;
`
当监听器执行时。
任何想法将不胜感激。
谢谢。
最佳答案
您只需将该对象添加到 PaintListener 的构造函数中即可。
例如
class MyPaintListener implements PaintListener
{
Image image;
MyPaintListener(Image image)
{
this.image = image;
}
void paintControl(...)
{
do stuff with image.
}
}
关于java - Eclipse SWT - Java 编程困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773868/