Eclipse SWT - Java编程困境

Dr.*_*ust 2 java eclipse swt

我正在编写一个Eclipse插件,它打开一个文件并显示文件中包含的所有图像.此图像显示是GUI应用程序的一部分.通过将每个图像与SWT Canvas小部件相关联来呈现每个图像.当我打开文件时,我拥有确定我必须显示的图像数量所需的所有信息.我虽然一个接一个地创建所有Canvas对象并将每个Canvas对象存储在某种类型的数组(如数据结构)中是有意义的.我打开的每个文件都有不同数量的图像要显示.我决定用一个ArrayList.

我按如下步骤操作:我为每个图像创建一个Canvas对象,并将所有Canvas对象存储在一个ArrayList.问题在于:每个Canvas对象都有一个PaintListenerMouseListener与之关联 - 用于调整大小并检测图像是否已被"单击".我在'for循环'中创建所有Canvas对象 - 包括为每个Canvas对象分配一个PaintListenerMouseListener,如下所示:

`

//
// 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执行时.

任何想法,将不胜感激.

谢谢.

Kir*_*lin 5

您可以将对象添加到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)