2

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

我进行如下操作:我为每个图像创建一个 Canvas 对象,并将所有 Canvas 对象存储在一个ArrayList. 这就是问题所在:每个 Canvas 对象都有一个PaintListenerMouseListener与之关联 - 用于调整大小并检测图像是否已被“点击”。我在“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' 用于确定在PaintListenerand中的不同 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;

`

当监听器执行时。

任何想法,将不胜感激。

谢谢。

4

3 回答 3

5

您可以将对象添加到 PaintListener 的构造函数中。

例如

class MyPaintListener implements PaintListener
{
 Image image;
 MyPaintListener(Image image)
 { 
    this.image = image;
 }
 void paintControl(...)
 {  
     do stuff with image.
 }
}
于 2009-04-21T18:22:05.940 回答
1

使用内部类而不是匿名内部类并将对象传递给构造函数。您在 anon 类中使用的变量未存储在对象中,因此在调用时它将在外部类中引用它的值。

于 2009-04-21T18:28:53.663 回答
0

你不能只使用一个临时的最终变量:

final JFrame f = new JFrame();
f.setLayout(new FlowLayout());
for (int i = 0; i < 10; i++) {
  final int curIdx = i;
  JButton btn = new JButton("Btn: " + i);
  btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      JOptionPane.showMessageDialog(f, "Item: " + curIdx);
    }
  });
  f.add(btn);
}
f.pack();
f.setVisible(true);

侦听器在声明时都会根据 var 的值触发事件,这听起来像是您想要的。

于 2009-04-21T18:26:51.420 回答