IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Java Discussion :

Projet sous Eclipse : W10 = OK, Ubuntu = erreurs


Sujet :

Eclipse Java

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut Projet sous Eclipse : W10 = OK, Ubuntu = erreurs
    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.
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Membre émérite
    Avatar de Mickael_Istria
    Homme Profil pro
    Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Inscrit en
    Juillet 2008
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 469
    Points : 2 997
    Points
    2 997
    Par défaut
    Il semblerait que ton project n'utilise pas la meme version d'Eclipse IDE et/ou de Java sur les 2 OS.
    En general, prends toujours la version la plus recente disponible.
    Pour du HTML, CSS, JavaScript, TypeScript, JSon, Yaml, Node... dans Eclipse IDE, installe Eclipse Wild Web Developer
    Pour du Rust dans Eclipse IDE, installe Eclipse Corrosion
    Follow me on twitter

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Mickael_Istria Voir le message
    Il semblerait que ton project n'utilise pas la meme version d'Eclipse IDE et/ou de Java sur les 2 OS.
    En general, prends toujours la version la plus recente disponible.
    Je vais vérifier cela.
    J'ai réfléchi à ce problème depuis et je pense que le fait d'utiliser une variable d'instance dans les définitions de classe n'est pas forcément très propre.
    Ainsi
    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());
    			}
    		});
    devrait s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    		age.addActionListener(new ActionListener()
    		{
    			@Override
    			public void actionPerformed(ActionEvent e) 
    			{
    				TextFieldAge tfa = (TextFieldAge) e.getSource();
    				System.out.println(tfa.getText());
    			}
    		});
    Je n'ai pas testé mais je pense que cela devrait marcher.
    Bien sûr TextFieldAge est un JTextField personnel permettant de rentrer un âge en ans, mois, semaines, jours
    C'est en respectant les autres que l'on se fait respecter.

Discussions similaires

  1. Quel plugin pour un gros projet sous eclipse ?
    Par cooltwan dans le forum Struts 1
    Réponses: 1
    Dernier message: 26/01/2007, 22h44
  2. [débutant] Paramétrage de projet sous Eclipse
    Par sunchai dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/04/2006, 17h27
  3. plusieurs projets sous eclipse..
    Par Invité dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/03/2006, 10h25
  4. [Info]Création d'un projet sous eclipse
    Par new_wave dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 08/01/2006, 22h06
  5. [Info]partager un projet sous eclipse
    Par sabine730 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/04/2005, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo