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

 Java Discussion :

Correction imposée par Eclipse


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Par défaut Correction imposée par Eclipse
    Bonjour,

    Je débute en Java. et pour cela je me suis acheté le livre Java 7 de chez Synthex.
    J'ai saisi l'essentiel des chapitres et là j'ai voulu expérimenter les exercices du dernier chapitre avec les interfaces graphiques.

    J'ai installé Eclipse. Le premier exercice je l'ai fait à la main comme expliqué dans le chapitre.

    Pour le second, j'ai voulu expérimenté le mode design d'Eclipse pour voir quel code il produisait :
    L'interface est constitué de 4 JPanel. Les 3 premiers ont des Label et une Combobox et un Textfield
    Le 4° a un bouton et un textfield

    Eclipse crée le combobox comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JComboBox comboBox = new JComboBox();
    comboBox.setModel(new DefaultComboBoxModel(new String[] {"0", "1", "2", "3"}));
    panel_1.add(comboBox);
    Quand je récupère la valeur du combobox choisi par l'opérateur, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int num1 = Integer.parseInt((String)comboBox.getSelectedItem());
    Et là Eclipse me demande de déclarer combobox avec "final". Ce que j'avais compris de ce modificateur, c'est pour déclarer des constantes.

    Est-ce que j'ai mal compris ce modificateur? et si non pourquoi faut-il faire cela?

    Merci d'avance de votre aide

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    si tu écris quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private JComboBox createCombo() {
    final JComboBox comboBox = new JComboBox();
    comboBox.addActionListener(new ActionListener() {
     
         @Override
         public void actionPerformed(ActionEvent e) {
    	  int num1 = Integer.parseInt((String)comboBox.getSelectedItem());
              faireQuelqueChose(num1);
         }
    });
    return comboBox;
    }
    on est obligé de déclarer comboBox final parce qu'on déclare cette variable dans le scope de la méthode createCombo() mais on l'utilise dans une méthode (actionPerformed) d'une autre classe (anonyme). La variable comboBox n'existant que dans la méthode createCombo,(), c'est une facilité que java offre en en faisant une constante de l'exporter pour être visible dans les méthodes des classes anonymes créées dans cette méthode.

    pour éviter d'avoir à rendre final cette variable, soit la déclarer membre de la classe qui contient la méthode createCombo, soit écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private JComboBox createCombo() {
    JComboBox comboBox = new JComboBox();
    comboBox.addActionListener(new ActionListener() {
     
         @Override
         public void actionPerformed(ActionEvent e) {
               JComboBox cb = (JComboBox)e.getSource();
    	  int num1 = Integer.parseInt((String)cb.getSelectedItem());
              faireQuelqueChose(num1);
         }
    });
    return comboBox;
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Par défaut
    Bonjour

    Merci de la réponse claire. C'est une vision que je n'avais pas pris en compte. J'étais dans la même class ... donc pas de problème selon ma première compréhension.

    Après essai de correction,
    J'ajoute que je ne peux utiliser votre proposition de correction car il n' y a pas d'event associé au combobox seulement sur un bouton. Donc il n' y a que l'artifice du "final"

    Voici le code :
    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
    public class Fen_cde extends JFrame {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private JPanel contentPane;
    	private JTextField textField;
    	private JTextField textField_1;
    	private JTextField textField_2;
    	private JTextField textField_3;
     
    	/**
             * Launch the application.
             */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					Fen_cde frame = new Fen_cde();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
    	/**
             * Create the frame.
             */
    	@SuppressWarnings({ "unchecked", "rawtypes" })
    	public Fen_cde() {
    		setTitle("Commande");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 631, 300);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new GridLayout(4, 1, 0, 0));
     
    		JPanel panel_1 = new JPanel();
    		contentPane.add(panel_1);
     
    		JLabel lblArticle = new JLabel("Article 1 - Prix unitaire = 20 \u20AC : Nombre =");
    		panel_1.add(lblArticle);
     
    		final JComboBox comboBox = new JComboBox();
    		comboBox.setModel(new DefaultComboBoxModel(new String[] {"0", "1", "2", "3"}));
    		panel_1.add(comboBox);
     
    		JLabel lblTotal = new JLabel("Total = ");
    		panel_1.add(lblTotal);
     
    		textField = new JTextField();
    		panel_1.add(textField);
    		textField.setColumns(10);
     
    		JPanel panel_2 = new JPanel();
    		contentPane.add(panel_2);
     
    		JLabel lblNewLabel = new JLabel("Article 2 - Prix unitaire = 30 \u20AC : Nombre =");
    		panel_2.add(lblNewLabel);
     
    		final JComboBox comboBox_1 = new JComboBox();
    		comboBox_1.setModel(new DefaultComboBoxModel(new String[] {"0", "1", "2", "3", "4", "5"}));
    		panel_2.add(comboBox_1);
     
    		JLabel label = new JLabel("Total = ");
    		panel_2.add(label);
     
    		textField_1 = new JTextField();
    		panel_2.add(textField_1);
    		textField_1.setColumns(10);
     
    		JPanel panel_3 = new JPanel();
    		contentPane.add(panel_3);
     
    		JLabel lblNewLabel_1 = new JLabel("Article 3 - Prix unitaire = 40 \u20AC : Nombre =");
    		panel_3.add(lblNewLabel_1);
     
    		final JComboBox comboBox_2 = new JComboBox();
    		comboBox_2.setModel(new DefaultComboBoxModel(new String[] {"0", "5", "10", "15", "20", "50"}));
    		panel_3.add(comboBox_2);
     
    		JLabel label_1 = new JLabel("Total = ");
    		panel_3.add(label_1);
     
    		textField_2 = new JTextField();
    		panel_3.add(textField_2);
    		textField_2.setColumns(10);
     
    		JPanel panel_4 = new JPanel();
    		contentPane.add(panel_4);
     
    		JButton btnCalculDuTotal = new JButton("Calcul du total");
    		btnCalculDuTotal.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				int num1 = Integer.parseInt((String)comboBox.getSelectedItem());
    				int val1 = 20 * num1;
    				textField.setText(Integer.toString(val1));
     
    				int num2 = Integer.parseInt((String)comboBox_1.getSelectedItem());
    				int val2 = 30 * num2;
    				textField_1.setText(Integer.toString(val2));
     
    				int num3 = Integer.parseInt((String)comboBox_2.getSelectedItem());
    				int val3 = 40 * num3;
    				textField_2.setText(Integer.toString(val3));
     
    				String rrr = Integer.toString(val1+val2+val3);
    				textField_3.setText(rrr);
     
    			}
    		});
    		panel_4.add(btnCalculDuTotal);
     
    		JLabel label_2 = new JLabel("Total = ");
    		panel_4.add(label_2);
     
    		textField_3 = new JTextField();
    		panel_4.add(textField_3);
    		textField_3.setColumns(10);
    	}
     
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    En effet, si l'écouteur n'écoute pas le combo, l'émetteur des évenements traités dans l'écouteur n'est pas le combo. Ce n'était pas à proprement parler une correction mais une indication de solution possible pour éviter le final, effectivement limité au cas ou on écoute directement le combo. Une autre solution aurait été de faire une classe étendant ActionListener avec passage dans le construceur de l'instance de JCombo (c'est un exemple de solution possible parmi pleins d'autres) :

    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
    class BtnActionListener implements ActionListener {
     
    private JCombo[] comboBox;
    public BtnActionListener(JCombo...comboBox) {
        this.comboBox=comboBox;
    }
     
    			public void actionPerformed(ActionEvent arg0) {
    				int num1 = Integer.parseInt((String)comboBox[0].getSelectedItem());
    				int val1 = 20 * num1;
    				textField.setText(Integer.toString(val1));
     
    				int num2 = Integer.parseInt((String)comboBox[1].getSelectedItem());
    				int val2 = 30 * num2;
    				textField_1.setText(Integer.toString(val2));
     
    				int num3 = Integer.parseInt((String)comboBox[2].getSelectedItem());
    				int val3 = 40 * num3;
    				textField_2.setText(Integer.toString(val3));
     
    				String rrr = Integer.toString(val1+val2+val3);
    				textField_3.setText(rrr);
     
    			}
    		});
    btnCalculDuTotal.addActionListener(new BtnActionListener(comboBox,comboBox_1,comboBox_2));
    A noter, que les textField étant membres de Fen_cde, ça n'aurait pas coûter grand chose de mettre les combos également

    Par contre, pourquoi utiliser des jtexfields pour répercuter les valeurs saisies dans les combo (à un coefficient prêt) : un JTextField est un champ de saisie, donc ça veut dire qu'on peut modifier son contenu et appuyer sur le bouton et là la valeur saisie va être remplacée. Un peu déconcertant pour l'utilisateur.

    Soit tu utilises de simple JLabel pour afficher la valeur coefficientée saisie dans la combo, soit tu rends ces textfields non éditables, soit tu fais de la double synchro (ce qui signifie implicitement que le combo permet de saisir des valeurs qui ne sont pas présentent dans la liste de choix) : quand on saisit dans un combo ou un textfield, on met à jour son pendant, et le bouton lui ne fait que lire l'un des deux, le textfield par exemple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Par défaut
    Bonjour,

    En effet les exo ne sont pas optimisés, ils présentent les différentes possibilités.
    Et là c'était le combobox.

    Pour le JTextField, ma première idée était de programmer un JLabel mais après recherche sur le net, il ne semble pas y avoir de méthode simple pour modifier le contenu du label donc je suis resté au JTextField.

    Merci

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par assyril Voir le message
    Pour le JTextField, ma première idée était de programmer un JLabel mais après recherche sur le net, il ne semble pas y avoir de méthode simple pour modifier le contenu du label donc je suis resté au JTextField.
    Pour modifier le texte affiché par un JLabel, c'est plutôt simple :

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/02/2010, 09h56
  2. [Eclipse] Tomcat lancé par eclipse
    Par shaun_the_sheep dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/06/2006, 15h24
  3. [Run]Exécution de java.exe au lieu de javaw.exe par Eclipse
    Par newfsch dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 24/11/2005, 12h53
  4. [API]JTAPI non reconnu par eclipse
    Par julio84 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/04/2005, 14h03
  5. [Débutant(e)] Ou trouver la commande lancée par eclipse
    Par Emdis dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/11/2004, 11h00

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