Bonjour,
Je développe en Java sous Eclipse. Un projet sous W10 ne comporte aucune erreur.
Par contre ce même projet sous Ubuntu est truffé d'erreurs du type : "Cannot refer to a non-final variable 'age' inside an inner class defined in a different method"
Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
public static void main(String[] args)
	{
		JFrame fenetre = new JFrame();
		fenetre.setSize(600, 100);
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panneau = new JPanel();
 
		JLabel label = new JLabel("entrer un âge");
		TextFieldAge age = new TextFieldAge("70s6m");
		age.setColumns(10);
		panneau.add(label);
		panneau.add(age);
 
		age.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				System.out.println(age.getText());
			}
		});
		fenetre.getContentPane().add(panneau);
		fenetre.setVisible(true);
	}
dans cette partie là
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
		age.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				System.out.println(age.getText());
			}
		});
la variable age doit être déclarée en "final" sous Ubuntu alors que sous W10 cela passe sans problème.
La proposition pour fixer cette erreur est : change modifier of 'age' to final.

Pour ceux qui voudraient l'intégralité de la classe, la voici.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
 
package actes.sepultures;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class TextFieldAge extends JTextField
{
	/**
         * L'âge est données sous la forme AaMmSsJj
         * @param s l'âge sous forme d'une String
         */
	public TextFieldAge(String s)
	{
		setDocument(new DocumentAge());
		setText(s);
	}
 
 
	public static void main(String[] args)
	{
		JFrame fenetre = new JFrame();
		fenetre.setSize(600, 100);
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panneau = new JPanel();
 
		JLabel label = new JLabel("entrer un âge");
		TextFieldAge age = new TextFieldAge("70s6m");
		age.setColumns(10);
		panneau.add(label);
		panneau.add(age);
 
		age.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				System.out.println(age.getText());
			}
		});
		fenetre.getContentPane().add(panneau);
		fenetre.setVisible(true);
	}
 
 
 
	class DocumentAge extends PlainDocument
	{
		@Override
		public void insertString(int offset, String str, AttributeSet a) throws BadLocationException 
		{
			super.insertString(offset, age(str), a);
		}
 
		//une procédure pour vérifier ce qui est entré
		private String age(String str)
		{
			//chaîne vide : rien à traiter
			if (str.isEmpty()) return str;
 
			//sinon on transforme en minuscule
			str = str.toLowerCase();
			//les caractères
			char[] caracteres = str.toCharArray();
 
			String s = "", v = "";
			try
			{
				v = this.getText(0, this.getLength());
			} catch (BadLocationException e)
			{
				e.printStackTrace();
			}
			char caracterePrecedent = (v.isEmpty() ? 0 : v.toCharArray()[v.length() - 1]);
 
			for(int i = 0; i < caracteres.length; i++)
			{
				char c = caracteres[i];
				//c'est un chiffre
				if (Character.isDigit(c))
				{
					s += c;
					v += c;
					caracterePrecedent = c;
					continue;
				}
				//ce n'est pas un chiffre, ni 'a', 'm', 's', 'j', on arrête tout
				if (!"amsj".contains("" + c)) break;
				//c'est 'a', 'm', 's' ou 'j', il doit être précédé d'un chiffre
				if (v.length() == 0) break;
				if (!Character.isDigit(caracterePrecedent)) break;
				//il ne peut y avoir qu'un seul 'a', 'm', 's', 'j' 
				if (v.contains("" + c)) break; 
				//la frappe de 'j' met fin à la frappe
				if (c == 'j')
				{
					s += c;
					break;
				}
				//le nombre de semaines
				if (c == 's')
				{
					s += c;
					caracterePrecedent = c;
					continue;
				}
				//le nombre mois, il ne doit pas y avoir eu de s
				if (c == 'm') 
				{
					if (!v .contains("s")) 
					{
						s += c;
						v += c;
						caracterePrecedent = c;
					}
					continue;
				}
				//le nombre d'années, il ne doit pas y avoir eu de m ou de s. Pour j c'est inutile car la frappe
				//de j met fin à la saisie
				if (c == 'a')
				{
					if (!v.contains("s") && !v.contains("m")) 
					{
						s+= c;
						v += c;
						caracterePrecedent = c;
					}
				}
			}
			return s;
		}
	}
}
Il s'agit d'un JTextField qui n'accepte que des entrées du type 3a2s pour 3 ans et 2 semaines, les valeurs acceptées sont 'a' pour les ans, 'm' pour les mois, 's' pour les semaines et 'j' pour les jours. On peut avoir 24m7j par exemple.