Bonjour,
J'ai une classe A qui contient une methode qui a une classe anonyme. Je voudrais savoir si je pouvais accéder aux variables d'instance de la classe A dans ma classe anonyme.
Merci
A+
Version imprimable
Bonjour,
J'ai une classe A qui contient une methode qui a une classe anonyme. Je voudrais savoir si je pouvais accéder aux variables d'instance de la classe A dans ma classe anonyme.
Merci
A+
Si je t'ai bien compris, oui tu peut y accéder, à la condition qu'aucune variable de la classe anonyme n'aie le même nom que la variable de la classe A que tu veut récupérer. Par contre tu ne pourras pas employer le this, puisque le this te renverra une référence vers la classe interne.
On peut utiliser this, il suffit d'écrire ClasseParente.this.
Ok, ce code est donc correct alors :
Et si je veux acceder à ma classe A dans la classe interne c'est :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public class A { private ArrayList<Thumbnail> thumbnailList; private void createAndAddThumbnail(final File [] files) { SwingWorker sw = new SwingWorker() { protected Object doInBackground() throws Exception { for(int i=0;i<files.length;i++) { Thumbnail thumbnail = new Thumbnail(files[i]); jPanel1.add(thumbnail); thumbnailList.add(thumbnail); } return ""; } }; sw.execute(); } }
Code:A.this
Ce code est incorrect du point de vue de la gestion des threads. La ligne suivante :
Devrait en fait être :Code:
1
2 jPanel1.add(thumbnail);
Il ne faut pas manipuler les objets Swing depuis un thread qui n'est pas l'EDT. Le SwingWorker invoque doInBackground() justement dans un autre thread. Il faut soit faire ce que je viens d'écrire ou ajouter tous les élements dans le JPanel dans le done() du SwingWorker qui est invoquée dans l'EDT.Code:
1
2
3
4
5
6 SwingUtilities.invokeLater(new Runnable() { public void run() { jPanel1.add(thumbnail); } });
Et puisque tu utilises Java 1.5 tu peux remplacer ta boucle par for (File thumbFile : files) et files[i] par thumbFile.
Ok merci.
Et est ce que le fait d'appelé un repaint dans le thread du SwingWorker est correct ?
Code:
1
2
3
4
5
6
7
8
9
10 SwingWorker sw = new SwingWorker() { protected Object doInBackground() throws Exception { for(Thumbnail thumbnail : thumbnailList) { BufferedImage image = createThumbnail(thumbnail.getFile()); thumbnail.setImage(image); jPanel1.repaint(); } return ""; } };
Oui (ainsi que revalidate() et les get/setText() + quelques autres).
Ok. Merci pour ces précisions.
A+
PS : Félicitation pour la démo des JavaOne, c'est super jolie ;)