J'écris un plugin Eclipse qui ouvre un fichier et affiche toutes les images contenues dans le fichier. Cet affichage d'image fait partie d'une application GUI. Chaque image est rendue en l'associant à un widget SWT Canvas. Lorsque j'ouvre le fichier, j'ai toutes les informations dont j'ai besoin pour déterminer le nombre d'images que je devrai afficher. Je pense qu'il serait logique de créer tous les objets Canvas, l'un après l'autre et de stocker chaque objet Canvas dans un type de tableau comme la structure de données. Chaque fichier que j'ai ouvert avec un nombre différent d'images à afficher. J'ai décidé d'utiliser un ArrayList
.Eclipse SWT - Dilemme de programmation Java
Je procède comme suit: Je crée un objet Canvas pour chaque image et stocke tous les objets Canvas dans un ArrayList
. Voici le problème: chaque objet Canvas est associé à PaintListener
et MouseListener
- pour redimensionner et détecter si une image a été «cliquée». Je crée tous les objets de toile dans une « boucle » - qui comprend l'affectation d'un PaintListener
et MouseListener
à chaque objet de toile, comme suit:
`
//
// 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++)
`
Le problème : La variable 'i' est utilisée pour déterminer quel élément accéder dans les différentes ArrayLists dans les PaintListener
et MouseListener
. Remarque J'utilise 'i' à des fins d'illustration ici. Je réalise que la variable 'i' définie dans la 'boucle for' ne peut pas être utilisée dans les classes internes des auditeurs. De toute façon ...... Quand les écouteurs reçoivent un événement, n'importe quelle variable que j'utilise pour essayer d'accéder à un élément spécifique d'une ArrayList contient sa valeur actuelle, pas la valeur quand les Auditeurs ont été définis.
Comment puis-je contourner cela en Java? Ce que je dois littéralement est le code dans la définition de chaque auditeur qui dit essentiellement équivaut à:
`
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;
`
lorsque l'auditeur exécute.
Toutes les idées seraient appréciées.
Merci.
Comme Robin, j'ai été battu :) – Olivier
A travaillé comme un charme. Merci. –