我正在编写一个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++)
Run Code Online (Sandbox Code Playgroud)
`
问题:变量'i'用于确定在PaintListener和中的不同ArrayLists中访问哪个元素MouseListener.注意我在这里使用'i'作为说明目的.我意识到'for循环'中定义的变量'i'不能用在Listeners的内部类中.无论如何......当监听器收到一个事件时,我用来尝试访问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;
Run Code Online (Sandbox Code Playgroud)
`
当Listener执行时.
任何想法,将不胜感激.
谢谢.
您可以将对象添加到PaintListener的构造函数中.
例如
class MyPaintListener implements PaintListener
{
Image image;
MyPaintListener(Image image)
{
this.image = image;
}
void paintControl(...)
{
do stuff with image.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1129 次 |
| 最近记录: |