Interface graphique addition,soutraction .

Fermé
nini - 30 avril 2012 à 00:46
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
- 5 mai 2012 à 04:37
Bonjour,
voici mon programme en java

import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;

public class add_et_st extends javax.swing.JFrame {


public add_et_st() {
super("titre de l'application");{}
JPanel panneau = new JPanel();
JButton addition = new JButton("aditione") ;
JButton soustr = new JButton("soustraire");

JTextField entier1 = new JTextField(" " );

JTextField entier2 = new JTextField( " ");

JTextField resultat = new JTextField(" " );
panneau.add(addition);
panneau.add(soustr);
panneau.add(entier1);
panneau.add(entier2);
panneau.add(resultat);
setContentPane(panneau);
setSize(200,100);
setVisible(true);
String saisie1= entier1.getText();
String saisie2= entier2.getText();

int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer();
result.toString();
resultat.setText(result);
}
public static void main(String[]args){
JFrame frarme = new add_et_st();

}
}

que je doit ajouter a mon programme pour que lorsque je saisie deux entier dans chacun des deux case entier1 et entier2 et je clic sur la bouton addition il m'affiche leur somme ou je clic sur sousrt il m'affiche la différence dans le troisième champ.
de que façon je doit utiliser itemlistener ect..
merci




12 réponses

bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
30 avril 2012 à 01:25
tu doit créer une nouvelle class qui implement ActionListener

par exemple

class pein implements ActionListener{

public void actionPerformed(ActionEvent e)
{
// ici le code que ton boutton doit executer
}
}

puis tu integre ActionListener dans ton bouton comme:

btn1.addActionListener(new pein());
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
Modifié par KX le 30/04/2012 à 08:31
Remarque : on peut créer cette classe implicitement en la déclarant directement dans la méthode.
Avantage : on a accès aux variables du code courant, ce qui n'est pas le cas dans une classe externe.

btn1.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
        // ici le code que le bouton doit exécuter 
    } 
});

Ou, si plusieurs boutons font la même chose :

ActionListener action = new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
        // ici le code que les boutons doivent exécuter 
    } 
};

btn1.addActionListener(action);
btn2.addActionListener(action);
0
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
30 avril 2012 à 13:19
oui ma solution pour un bouton ou pour des boutton qui font la même tache
et moi quand je veux une autre tache je creer une autre class
0
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
30 avril 2012 à 13:20
et je crois que dans ton exemple
btn1.addActionListener(action);
btn2.addActionListener(action);

c'est 2 boutton , il vont faire la même tache n'est ce pas
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
30 avril 2012 à 14:21
En effet, c'est pour ça que j'ai écrit "si plusieurs boutons font la même chose"
Si on a un seul bouton qui fait la tâche, la première méthode est à privilégier.
Créer une classe est en général plus gênant qu'autre chose vu que l'on n'a pas accès aux autres données, ou alors il faut bidouiller l'encapsulation, ou tout passer en paramètre du constructeur...
0
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
30 avril 2012 à 15:42
apparemment moi j'aime utiliser les classes
0
bonjour bouchrot et vous tous
j'ai ajouter ce que tu ma dit mais dans ma boucle if que doit je faire

class pein implements ActionListener{

public void actionPerformed(ActionEvent e)
{
// ici le code que ton boutton doit executer
// if(quelle methode doit je utiliser ici pour dir si la bouton adition est clice?)
// {int i=Integer.getInteger(saisie1);
// int j=Integer.getInteger(saisie2);
// Integer result=new Integer(saisie1+saisie2);
// resultat.setText(result.toString());
// }
//}
}
addition.addActionListener(new pein());
merci pour votre reponse.
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
1 mai 2012 à 01:01
if(quelle methode doit je utiliser ici pour dir si la bouton adition est clice?)
Pas besoin de faire ce test, le simple fait d'être rentré dans la méthode actionPerformed signifie que le bouton a été cliqué !

Remarque : saisie1, saisie2, et resultat, n'existent pas dans la class pein que tu as créé !
C'est ce que j'expliquais à bouchrot :

* soit tu passes ces valeurs dans un constructeur de ta classe, malheureusement ça risque de ne pas faire ce que tu veux si modifies les valeurs de saisie1 et saisie2 entre la construction du Listener, et le clic sur le bouton...

class Pein implements ActionListener
{
    private final String saisie1, saisie2;
    private final JTextField resultat;

    public Pein(String saisie1, String saisie2, JTextField resultat)
    {
        this.saisie1 = saisie1;
        this.saisie2 = saisie2;
        this.resultat = resultat;
    }

    public void actionPerformed(ActionEvent e) 
    {
        int i = Integer.getInteger(saisie1); 
        int j = Integer.getInteger(saisie2);
        Integer result=new Integer(saisie1+saisie2); 
        resultat.setText(result.toString()); 
    } 
} 

btn1.addActionListener(new Pein(saisie1,saisie2,resultat));

* soit tu instancies l'ActionListener en live dans le code et tu auras accès à ces valeurs (sous réserve qu'elles soient avec le mot clé final)

btn1.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        resultat.setText(String.valueOf(Integer.getInteger(saisie1) +Integer.getInteger(saisie2)));
    }
});
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
1 mai 2012 à 11:49
Remarque : Integer.getInteger(String) ne fera pas ce que tu veux.
Dans ton cas il faut utiliser Integer.valueOf(String) avec quelques précautions quand même...
0
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
1 mai 2012 à 10:14
pour faciliter la tache pour toi,tu doit faire créer un objet source comme ça


class pein implements ActionListener{

public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if(source == btn1){
//code pour boutton 1

} else if (source == btn2){
//code pour boutton 2 etc...
}

}

}
et pour tes bouttons tu doit faire comme ça

btn2.addActionListener(new pein());
0
bonjour
voici mon programme finale il m'affiche mon interface mais lorsque je saisie les 2 entier et je clic sur addition ou soustraction rien ne ce passe.
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.lang.Integer.*;
import java.lang.String.*;

public class add_et_st extends javax.swing.JFrame {


public add_et_st() {
super("titre de l'application");
JPanel panneau = new JPanel();
JButton addition = new JButton("aditione") ;
JButton soustr = new JButton("soustraire");

JTextField entier1 = new JTextField(" " );

JTextField entier2 = new JTextField( " ");

JTextField resultat = new JTextField(" " );
panneau.add(addition);
panneau.add(soustr);
panneau.add(entier1);
panneau.add(entier2);
panneau.add(resultat);
setContentPane(panneau);
setSize(200,100);
setVisible(true);
String saisie1= entier1.getText();
String saisie2= entier2.getText();

class pein implements ActionListener{// ici il mafiche q'il ya erreur au niveau de pein et //Action Listener
private final String saisie1, saisie2;
private final JTextField resultat;
private String result;
private final JButton soustr;
private final JButton addition;
public void actionPerformed(ActionEvent e)// ici il ya aussi erreur au niveau de ActionEvent
{
Object source = e.getSource();
if(source == addition){
int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer(saisie1+saisie2);
resultat.setText(result.toString());
//code pour boutton 1

} else if (source == soustr){
int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer(saisie1-saisie2);// ici il me dit ya une erreur
resultat.setText(result.toString());
}

}

}
addition.addActionListener(new pein()); // ici il m'afiche qu'il ya erreur au niveau de new pein()
soustr.addActionListener(new pein());//et ici aussi meme erreur
setVisible(true);
}
public static void main(String[]args){
JFrame frarme = new add_et_st();

}
}
merci a tous
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
Modifié par KX le 1/05/2012 à 15:14
Tu ne peux pas déclarer une classe en plein milieu de ton code comme ça !
Si tu choisi la méthode avec des classes supplémentaires, voici la structure que tu devrais avoir.
Mais encore une fois, je doute que ce soit la manière la plus simple de faire ce que tu veux...

import ... 

class Pein extends ActionListener 
{ 
    // ... 

    public Pein(...)
    {
        // ...
    }

    public void actionPerformed(ActionEvent e) 
    { 
        // ... 
    } 
} 

public class AddEtSt extends JFrame 
{ 
    // ... 

    public AddEtSt() 
    { 
        // ... 
    } 

    public static void main(String...args) 
    { 
        // ... 
    } 
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
1 mai 2012 à 18:09
package interfaces.graphique.essai;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.event.*;
import java.lang.Integer.*;
import java.lang.String.*;
public class çamarche extends JFrame{
private final String saisie1, saisie2;
private final JTextField resultat;
private String result;
private final JButton soustr;
private final JButton addition;
private JTextField entier1;
private JTextField entier2;


public çamarche() {
super("titre de l'application");
JPanel panneau = new JPanel();
addition = new JButton("aditione") ;
addition.addActionListener(new pein());
soustr = new JButton("soustraire");
soustr.addActionListener(new pein());

entier1= new JTextField(" " );

entier2 = new JTextField( " ");

resultat = new JTextField(" " );
panneau.add(addition);
panneau.add(soustr);
panneau.add(entier1);
panneau.add(entier2);
panneau.add(resultat);
setContentPane(panneau);
setSize(200,100);
setVisible(true);
saisie1= entier1.getText();
saisie2= entier2.getText();

setVisible(true);
}
public static void main(String[]args){
JFrame frarme = new çamarche();

}

class pein implements ActionListener{

public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if(source == addition){
int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer(saisie1+saisie2);
resultat.setText(result.toString());
//code pour boutton 1

} else if (source == soustr){
int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer(saisie1-saisie2);// ici il me dit ya une erreur
resultat.setText(result.toString());
}

}

}
}

tient j'ai seulement ordonné ton code il reste seulement une seulement erreur je ne la pas compris
ici :Integer result=new Integer(saisie1-saisie2);
0
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
1 mai 2012 à 18:10
je vois que tu as compliquer ton programme
0
bouchrot
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
Modifié par bouchrot le 1/05/2012 à 18:14
attend j'ai trouvé la dernière errer

ce n'ai pas saisie1-saisie2

remplacé les par i-j

par ce que tu as recupérer la valeur de saisie1 dans i et lavaleur de saisie2 dans j
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
1 mai 2012 à 18:20
Integer.getInteger est faux ! voir ici
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
1 mai 2012 à 18:25
Il y a des erreur de logique, comme par exemple faire ces opérations dans le constructeur :

saisie1= entier1.getText();
saisie2= entier2.getText();

Ces opérations doivent être faites dans l'ActionListener, sinon tu auras toujours les même valeurs que celles que tu as à la fin du constructeur, c'est à dire " " et " "
Alors que le but de l'ActionListener est d'être appelé que ces valeurs aient changées !
0
Utilisateur anonyme
1 mai 2012 à 18:30
Salut,

Une des solutions (cadeau pour le jour de la fête du (vrai!!!) travail :

   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JButton;
   import javax.swing.JTextField;
   // ou bien: import javax.swing.*;
	
   import java.awt.event.ActionEvent; 
   import java.awt.event.ActionListener;
   // ou bien: import java.awt.*; 

   public class Add_et_st extends JFrame implements ActionListener
   {
      private int result = 0;
      private JTextField entier1;
      private JTextField entier2;
      private JTextField resultat;
      private String saisie1 = "";
      private String saisie2 = "";
      
      private JButton addition;
      private JButton soustr;
      
      public Add_et_st()
      { 
         super("I + ou - J");
         setDefaultCloseOperation(EXIT_ON_CLOSE);
          
         JPanel panneau = new JPanel();
            
         addition = new JButton("+");
         addition.addActionListener(this);
        
         soustr = new JButton("-"); 
         soustr.addActionListener(this); 
      
         entier1 = new JTextField(12); 
         entier2 = new JTextField(12); 
         resultat = new JTextField(14);
         
         resultat.setEnabled(false);
      
         panneau.add(entier1); 
         panneau.add(entier2); 
         panneau.add(resultat);
         panneau.add(addition); 
         panneau.add(soustr);
      	 
         setContentPane(panneau); 
         setSize(200,147); 
         setVisible(true); 
      }
       
      public static void main(String[]args){ 
         JFrame frame = new Add_et_st();
      }
      
      public void actionPerformed( ActionEvent ae )
      {
         Object qui = ae.getSource();
         
         int i = Integer.parseInt(entier1.getText()); 
         int j = Integer.parseInt(entier2.getText());
         
         if (qui == addition) 
         {
            result = i + j;
         }
         else
            if (qui == soustr) 
            {
               result = i - j;
            }
         System.out.println(result);
         resultat.setText(Integer.toString(result));
      }
   }


C'est améliorable sans oublier le contrôle des valeurs entrées.

Si tu as besoin d'éclaicissements (nini) manifeste toi...

Cordialement,

Dan
0
bonjour
après l'ajout de deux bibliothèques et le remplacement de saisie1-saisie2 par i - j
il n'y a qu'une seule erreur si ça ne marche pas je vais tricher la solution de danimo

import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.lang.Integer.*;
import java.lang.String.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class add_et_st extends javax.swing.JFrame {


public add_et_st() {
super("titre de l'application");
JPanel panneau = new JPanel();
JButton addition = new JButton("aditione") ;
JButton soustr = new JButton("soustraire");

JTextField entier1 = new JTextField(" " );

JTextField entier2 = new JTextField( " ");

JTextField resultat = new JTextField(" " );
panneau.add(addition);
panneau.add(soustr);
panneau.add(entier1);
panneau.add(entier2);
panneau.add(resultat);
setContentPane(panneau);
setSize(200,100);
setVisible(true);
String saisie1= entier1.getText();
String saisie2= entier2.getText();

class pein implements ActionListener{ // c'est ici l'erreur au niveau de pein le
// compilateur me dit ceci variable saisie might not have been initialized
private final String saisie1, saisie2;
private final JTextField resultat;
private String result;
private final JButton soustr;
private final JButton addition;
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if(source == addition){
int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer(saisie1+saisie2);
resultat.setText(result.toString());
//code pour boutton 1

} else if (source == soustr){
int i=Integer.getInteger(saisie1);
int j=Integer.getInteger(saisie2);
Integer result=new Integer(i-j);
resultat.setText(result.toString());
}

}

}
addition.addActionListener(new pein());
soustr.addActionListener(new pein());
setVisible(true);
}
public static void main(String[]args){
JFrame frarme = new add_et_st();

}
merci
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
2 mai 2012 à 07:36
J'ai l'impression que tu ne prends pas en compte tout ce qu'on te dis ! Regarde ici, et ici pour commencer. Pour ton erreur, c'est parce que tu as des champs dans la classe Pein que tu n'initialises pas ! Il faut que tu crées un constructeur pour lui passer ces valeurs, voir ici.

Quant à la solution de Danimo, bien sûr elle fonctionne, cependant elle n'utilise aucune des deux techniques que bouchrot ou moi même t'avons présentés (à savoir la création d'une classe à part pour le Listener, et l'instanciation du Listener directement dans le code).
Ce que Danimo fait, c'est de considérer que la classe Add_et_st est à la fois l'interface graphique et le gestionnaire d'évènement de cette interface graphique, une sorte de classe 2 en 1.
Perso, je n'aime pas trop faire comme ça, je trouve que ce n'est pas cohérent, ce serait comme faire une classe qui serait à la fois Voiture et Essence en disant que la voiture roule grâce à un moteur qui se consomme soi même, ça a quelque chose de magique plus que logique.
En plus te donner un code tout fait n'est pas dans ton intérêt, comme tu l'as dit, ce serait de la triche, réfléchir à tes erreurs et comparer les différentes méthodes est bien plus intéressant, surtout si tu arrives à voir les avantages et inconvénients des 3 méthodes qui te sont proposées, et réussir à les réutiliser au bon moment lors de tes futurs programmes.
0
après tes modifications KX le programme est ceci aucune erreur n'est affiche
mais rien ne ce passe
j'ai ignorer la bouton soustraction parce que j'attends que la bouton addition marche premièrement


import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.lang.Integer.*;
import java.lang.String.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class add_et_st extends javax.swing.JFrame {


public add_et_st() {
super("titre de l'application");
JPanel panneau = new JPanel();
JButton addition = new JButton("aditione") ;
JButton soustr = new JButton("soustraire");

JTextField entier1 = new JTextField(" " );

JTextField entier2 = new JTextField( " ");

JTextField resultat = new JTextField(" " );
panneau.add(addition);
panneau.add(soustr);
panneau.add(entier1);
panneau.add(entier2);
panneau.add(resultat);
setContentPane(panneau);
setSize(200,100);
setVisible(true);
class pein implements ActionListener{
String saisie1;
String saisie2;
private final JTextField resultat;
public pein (String saisie1 ,String saisie2, JTextField resultat){
this.saisie1 = saisie1;
this.saisie2 = saisie2;
this.resultat = resultat;
}
public void actionPerformed(ActionEvent e)
{
int i = Integer.getInteger(saisie1);
int j = Integer.getInteger(saisie2);
Integer result=new Integer(i+j);
resultat.setText(result.toString());
}

}
String saisie1= entier1.getText();
String saisie2= entier2.getText();

addition.addActionListener(new pein(saisie1,saisie2,resultat));
setVisible(true);
}
public static void main(String[]args){
JFrame frarme = new add_et_st();

}






}
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 219, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 160, Short.MAX_VALUE)
);

pack();
}// </editor-fold>


// Variables declaration - do not modify
// End of variables declaration
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
2 mai 2012 à 21:11
"après tes modifications KX"... Perso, je vois toujours des getInteger qui se promènent alors que je l'ai dit au moins trois fois déjà, ça ne fait pas ce que tu attends !
De plus j'ai dit, que les saisie1= entier1.getText(); devaient être dans l'actionPerformed et ils n'y sont toujours pas ce qui signifie que la modification des valeurs n'a aucune incidence, ce seront toujours les valeurs par défaut " " et " " qui seront prises en compte...
J'ai pas tout regarder mais rien que ces modifications là que j'avait indiqué ne sont pas effectuées, pourtant elles sont primordiales !
0
bnjour
j'ai remplace Integer.getInteger par Integer.valueOf(saisie1);
et j'ai mis saisie1=entier1.getText() dans l'actionperformed lecomplateur ma afficher une erreur au niveau de entier1 voir le prog

import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.lang.Integer.*;
import java.lang.String.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class add_et_st extends javax.swing.JFrame {


public add_et_st() {
super("titre de l'application");
JPanel panneau = new JPanel();
JButton addition = new JButton("aditione") ;
JButton soustr = new JButton("soustraire");

JTextField entier1 = new JTextField(" " );

JTextField entier2 = new JTextField( " ");

JTextField resultat = new JTextField(" " );
panneau.add(addition);
panneau.add(soustr);
panneau.add(entier1);
panneau.add(entier2);
panneau.add(resultat);
setContentPane(panneau);
setSize(200,100);
setVisible(true);
class pein implements ActionListener{
String saisie1;
String saisie2;
private final JTextField resultat;
public pein (String saisie1 ,String saisie2, JTextField resultat){
this.saisie1 = saisie1;
this.saisie2 = saisie2;
this.resultat = resultat;
}
public void actionPerformed(ActionEvent e)

{
saisie1= entier1.getText();// c'est ici l'erreur

int i = Integer.valueOf(saisie1);
int j = Integer.valueOf(saisie2);
Integer result=new Integer(i+j);
resultat.setText(result.toString());
}

}
String saisie1= entier1.getText();
String saisie2= entier2.getText();

addition.addActionListener(new pein(saisie1,saisie2,resultat));
setVisible(true);
}
public static void main(String[]args){
JFrame frarme = new add_et_st();

}
}


merci
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
2 mai 2012 à 22:05
Chez moi le message d'erreur est clair :

Cannot refer to a non-final variable entier1 inside an inner class defined in a different method
Change modifier of 'entier1' to final

Il faut déclarer entier1 avec le mot clé final.

final JTextField entier1 = new JTextField();
Cependant, j'aimerais bien savoir à quoi sert ton constructeur de pein vu que tu ne te sers jamais des valeurs que tu récupères !!!

De plus tu n'as pas suivi la structure de classe que j'avais mis ici.
Si c'est pour faire des inner-class, autant faire la méthode avec instanciation directe !
0
Re,

J'ai corrigé çamarche qui est maintenant Camarche et ça marche


   import javax.swing.*;    
   import java.awt.*;    
   import java.awt.event.ActionEvent;    
   import java.awt.event.ActionListener;    
   import javax.swing.event.*;    
   import java.lang.Integer.*;    
   import java.lang.String.*;   
    
   public class Camarche extends JFrame{   
      
      private String saisie1, saisie2;    
      private final JTextField resultat;    
      private String result;    
      private final JButton soustr;    
      private final JButton addition;    
      private JTextField entier1;    
      private JTextField entier2;    
      
      
      public Camarche() {    
         super("titre de l'application");    
         JPanel panneau = new JPanel();    
         addition = new JButton("aditione") ;    
         addition.addActionListener(new Pein());    
         soustr = new JButton("soustraire");    
         soustr.addActionListener(new Pein());    
         
         entier1= new JTextField(10);   // 10 pour avoir un champ de saisie 
         
         entier2 = new JTextField(10);  // moins rikiki    
         
         resultat = new JTextField(10); //   
         panneau.add(addition);    
         panneau.add(soustr);    
         panneau.add(entier1);    
         panneau.add(entier2);    
         panneau.add(resultat);    
         setContentPane(panneau);    
         setSize(220,150); // taille modifiée   
         setVisible(true);    
         //saisie1= entier1.getText(); // ici on n'a pas encore saisi: déplacé >>> listener   
         //saisie2= entier2.getText(); // "      "       "    
         
         setDefaultCloseOperation(EXIT_ON_CLOSE); // <<<<<<< ajouté   
         setVisible(true);    
      }    
      public static void main(String[]args){    
         JFrame frarme = new Camarche();    
         
      }    
      
      class Pein implements ActionListener{    
         
         public void actionPerformed(ActionEvent e)    
         {    
            Object source = e.getSource();   
               
              
            saisie1= entier1.getText();    
            saisie2= entier2.getText();   
            int i=Integer.parseInt(saisie1);    
            int j=Integer.parseInt(saisie2);   
                  
            if(source == addition){    
               //int i=Integer.getInteger(saisie1);    
               //int j=Integer.getInteger(saisie2);    
               Integer result=new Integer(i+j);    
               resultat.setText(result.toString());    
            //code pour boutton 1    
               
            }    
            else if (source == soustr){    
               //int i=Integer.getInteger(saisie1);    
               //int j=Integer.getInteger(saisie2);    
               Integer result=new Integer(i-j);// ici il ne dit plus ya une erreur    
               resultat.setText(result.toString());    
            }    
            
         }    
         
      }    
   }    


Ne pas oublier de contrôler la saisie (NAN, trop long etc...)

Dan
Plus on apprend... plus on se rend compte qu'on ne connaît pas grand-chose.
0
VRAIMENT ca recemble a mon premier essaie c'est j'ai pri ce programme merci beaucoup
mais drnier question
que veut dir ceci?
setDefaultCloseOperation(EXIT_ON_CLOSE);
0
KX
Messages postés
16559
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
28 juin 2022
2 961
5 mai 2012 à 04:37
setDefaultCloseOperation(EXIT_ON_CLOSE); signifie que la fermeture de la fenêtre va programmer l'arrêt du programme (sinon le programme continue à tourner sans qu'on puisse l'arrêter)

Remarque : CCM n'a pas pour vocation à te donner des réponses toutes faites, et il est beaucoup plus dans ton intérêt à comprendre pourquoi ton programme ne marchait pas, sinon la prochaine fois tu ne sauras toujours pas le faire !

Pour "conclure", il y avait surtout deux méthodes différentes qui t'étaient proposées, celle proposée par bouchrot dans la toute premier réponse (ici) qui consiste à créer une classe supplémentaire pour le Listener, ou celle que j'avais proposé dans la deuxième réponse (ici) qui consiste à instancier directement le Listener dans le code. de là était parti un petit débat entre bouchrot et moi pour savoir lequel était "le meilleur", et de là tu es parti sur la méthode "de bouchrot", même si je pense toujours que "la mienne" était plus simple ;-)

Comme je les avait faites dans mon coin (il y a plusieurs jours maintenant), voici donc le code que j'ai fait avec chacune des deux méthodes. Les deux donnent évidement le même résultat...
Prends bien le temps de regarder les différences, pour mieux t'en resservir la prochaine fois :

Version avec classe externe pour le Listener (vers laquelle tu t'es dirigée)

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

class Listener implements ActionListener
{
    enum Operation {Add, Sub}
    
    private final JTextField saisie1;
    private final JTextField saisie2;
    private final JTextField resultat;
    private final Operation op;

    public Listener(JTextField entier1, JTextField entier2, JTextField resultat, Operation op)
    {
        this.saisie1 = entier1;
        this.saisie2 = entier2;
        this.resultat = resultat;
        this.op = op;
    }
    
    public void actionPerformed(ActionEvent e) 
    {
        try
        {
            int i = Integer.valueOf(saisie1.getText()); 
            int j = Integer.valueOf(saisie2.getText());
            
            switch (op)
            {
                case Add : resultat.setText(String.valueOf(i+j)); break;
                case Sub : resultat.setText(String.valueOf(i-j)); break;
            }
        }
        catch (NumberFormatException ex)
        {
            resultat.setText("");
        }
    }
}

public class AddEtSt extends JFrame
{
    private static final long serialVersionUID = 1;
    
    public AddEtSt() 
    {
        final JTextField entier1 = new JTextField();
        final JTextField entier2 = new JTextField();        
        final JTextField resultat = new JTextField();
        
        JButton addition = new JButton("additionner");
        addition.addActionListener(new Listener(entier1,entier2,resultat,Listener.Operation.Add));
        
        JButton soustr = new JButton("soustraire");
        soustr.addActionListener(new Listener(entier1,entier2,resultat,Listener.Operation.Sub));
        
        setLayout(new GridLayout(5,1));
        add(entier1);
        add(entier2);
        add(addition);
        add(soustr);
        add(resultat);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(100,200);
        setVisible(true);
    }
    
    public static void main(String...args)
    {
        new AddEtSt();
    }
}

Version avec le Listener directement dans le code (que je trouve plus simple) :

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class AddEtSt extends JFrame
{
    private static final long serialVersionUID = 1;
    
    public AddEtSt() 
    {
        final JTextField entier1 = new JTextField();
        final JTextField entier2 = new JTextField();        
        final JTextField resultat = new JTextField();
        
        final JButton addition = new JButton("additionner");
        final JButton soustr = new JButton("soustraire");
        
        ActionListener listener = new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    int i = Integer.valueOf(entier1.getText()); 
                    int j = Integer.valueOf(entier2.getText());

                    if (e.getSource()==addition)
                        resultat.setText(String.valueOf(i+j));
                    if (e.getSource()==soustr)
                        resultat.setText(String.valueOf(i-j));
                }
                catch (NumberFormatException ex)
                {
                    resultat.setText("");
                }
            }            
        };
        
        addition.addActionListener(listener);
        soustr.addActionListener(listener);
        
        setLayout(new GridLayout(5,1));
        add(entier1);
        add(entier2);
        add(addition);
        add(soustr);
        add(resultat);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(100,200);
        setVisible(true);
    }
    
    public static void main(String...args)
    {
        new AddEtSt();
    }
}
0