Evénéments et ecouteurs

Paps@ -  
 Paps@ -
Bonjour,je sais que vous pouvez m'aider alors n'hésiter pas:

Là est ma méthode de sauvegarde dans un fichier .txt
private void AutoriserSave(){
if (text1.getText().length()!=0 )
bouton1.setEnabled(true);
else
bouton1.setEnabled(false);
}

Ici j'ai l'appel de ma methode ci-dessus:

text1.addTextListener( new TextListener(){
public void textValueChanged(TextEvent e) {
AutoriserSave( ); }
});

on me signale une incompatibilité entre addTextListener et JTextField. Mais quand je remplace avec addActionListener pas de problème de compilation, seulement y a pas de sauvegarde qui est mon objectif.

Alors que me proposez-vous pour remédier ?

4 réponses

java4ever
 
Bonjour,
Tu utilises une méthode de java.awt.TextComponant qui est une sous classe de TextFiled (package jva.awt), alors que ton composant JTextField est un composant swing du package javax.swings.
Dans le cas des swings, qui ont ne architecture MVC, il faut mettre un listener sur le document du JtextField comme ceci :

DocumentListener dl = new DocumentListener() {
void changedUpdate(DocumentEvent evt){...};
void insertUpdate(DocumentEvent evt){...};
void removeUpdate(DocumentEvent evt){...};
....};
JTextField jtext1 = new JTextField();
jtext1.getDocument().addDocumentListener(dl);

Si tu utilisais un logiciel IDE comme Eclipse ou NetBean, qui sont gratuits, tu aurait presque immédiatement la soluce. N'oubie pas non plus de regarder l javadocs du jdk, il y a plein de choses dedans !
Bon courage !
1
Paps@
 
Merci pour ton aide java4ever, ça marché.
Mais permet moi encore:
J'ai class Interface1 qui appelle class Interface2. Au moment de l'exécution j'obtiens Interface1 et si je le souhaite j'appelle Interface2. La fermeture de l'une des interfaces entraine la fermeture de l'autre. Pourtant je souhaite que la fenêtre principale Interface1 reste toujours ouverte même si je ferme les autre fenêtre( Interface2) .

Merci de me proposer des solutions
0
java4ever
 
Re-bonjour Paps@
je te prie de m'excuser mais ta nouvelle question est pour moi totalement incompréhensible !
C'est quoi Interface1 et Interface 2, des JFrame, des JPanels ?, depuis quelle classe les instancie tu ? Qu'est-ce que tu entends par fermer une interface ?
En plus, je te mets en garde sur le vocabulaire : en java, une interface est une entité qui décrit un comportement par des signatures de méthodes (en gros une classe dont toutes les méthodes ont un corps vide à redéfinir au cas par cas). Toi, j'ai l'impression que tu emploies ce mot pour décrire une fenêtre graphique, non ?
Décris davantage ton problème, et un autre ou moi même pourrons peut-être t'aider.
Ceci est dit sans vouloir te vexer, c'est juste que ta demande est trop imprécise, on est d'accord ?
0
Paps@
 
C'est toujours sage de dire à une personne qu'elle est dans l'erreur si c'est effectivement le cas. Dis moi tout pourvu que tes propos m'aident à mieux comprendre et à mon tour répondre aux questions d'autrui comme tu le fais en ce moment avec moi.//

Oui je parle de fenêtre graphique(le résultat de l'exécution de mon code).
C'est-à-dire à partir de la 1ere fenêtre j'ouvre la seconde. Mais je veux fermer les fenêtres ouvertes une par une(en commençant par la dernière ouverte) ,et toutes les deux se ferme en même temps.
En espérant être plus précis...

Ta réponse et tes précisions me submergent davantage de questions;mais je vais essayer de ne pas les poser toutes à la fois.
J'espère que tu seras très patient avec moi ???
0
java4ever
 
Re-bonjour Paps@ je vois que tu as un côté philosophe !
Je ne suis pas très éclairé quand même, et je crois que le mieux serait que tu fournisse un extrait de ton code.
Comment "ferme"-tu les fenêtres, est-ce en utilisant la méthode dispose ?
tu ne m'a pas donné d'indications sur la structure de ton programme :
Y a t-il un contrôleur qui crée, ouvre et ferme les fenêtres en fonction d'événement clavier ou souris ?
Ou se trouvent les références au fenêtres, et de quel type sont elles ? (classe de base notamment) ?
A+
0
Paps@
 
Bonjour java4ever,tu es gentil,merci pour ton aide. Je ne sais quel partie de mon code d'envoyé. Je t'envoie tout en m'excusant beaucoup que cela te prenne trop de temps. Corrige mes erreurs...
En fait c'est un projet et je l'améliore au fur et à mesure....Tu peux l'exécuter pour voir

public class Menus extends JFrame {
public void run(){
MaFenetre fenetre = new MaFenetre();
fenetre.setVisible(true);//On la rend visible
}
public static void main( String[] args ) {
new Menus().run();
}}


public class MaFenetre extends JFrame{
private static final long serialVersionUID = 1L;
MaFenetre() {
super();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});

setup();

JMenu menu = new JMenu("Machines", true);
JMenuItem mach1 = new JMenuItem("Ajouter");
mach1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Machine();
}});
menu.add(mach1);

JMenuItem mach2 = new JMenuItem("Rechercher");
mach2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Machine();
}});
menu.add(mach2);

JMenuItem mach3 = new JMenuItem("Rechercher");
mach3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Machine();
}});
menu.add(mach3 );

JMenuItem mach4 = new JMenuItem("Liste");
mach4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Machine();
}});
menu.add(mach4 );
menu.add(new JSeparator());
JMenuItem quiter = new JMenuItem("Quitter");
quiter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}});
menu.add(quiter );

JMenu dia = new JMenu("Diagnostique", true);
JMenuItem dia1 = new JMenuItem("Ajouter");
dia1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Machin();
}});
dia.add(dia1 );

JMenuBar mb = new JMenuBar();
mb.add(menu);
mb.add(dia);
setJMenuBar(mb);

setTitle("D.S.I : GESTION DU MATERIEL EN DEPANNAGE");
setForeground(Color.blue);
setResizable(false);
setVisible(true);
}
void setup() {
int largeur =500, hauteur = 600;
setSize(largeur, hauteur);
Dimension tailleEcran = Toolkit.getDefaultToolkit().getScreenSize();
int largeurEcran = tailleEcran.width;
int hauteurEcran = tailleEcran.height;
int xPos = (largeurEcran - largeur) / 2;
int yPos = (hauteurEcran - hauteur) / 2;
setLocation(xPos, yPos);
}
}


public class Machine extends JFrame {
private static final long serialVersionUID = 1L;
JLabel L1,L2,L3,L4,L5,L6,L7,L8; JLabel typ,struct;
JTextField T1,T2,T3,T4,T5,T6,T7,T8;
JLabel case1,case2,case3,case4,case5,case6;
JTextField text1,text2,text3,text4,text5,text6;
JButton bouton1,bouton2,bouton3;
Container ContentPane;

private FileWriter fluxwrite; //flux en écriture (fichier texte)
private BufferedWriter fluxout;//tampon pour lignes du fichier

public Machine(){
creationDesComposants(); }

//Active ou désactive le bouton pour sauvegarde :
private void AutoriserSave(){
if (text1.getText().length()!=0 && text2.getText().length()!=0 )
bouton2.setEnabled(true);
else
bouton2.setEnabled(false);
}

public void ecrireEnreg(String record) {
try {
fluxout.write(record);//écrit les infos
fluxout.newLine( ); //écrit le eoln
}
catch (IOException err) {
System.out.println( "Erreur : " + err ); }
}

void creationDesComposants(){
ContentPane = this.getContentPane( ) ;
setResizable(false); // la fenêtre ne peut pas être retaillée par l'utilisateur
ContentPane.setLayout(null); // pas de Layout, nous positionnons les composants nous-mêmes
ContentPane.setBackground(Color.lightGray);
setSize(570, 430);
setTitle("AJOUT");
setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
setVisible(true);

L1 = new JLabel("DONNEES DE LA MACHINE");L1.setBounds(40, 15, 250, 23);ContentPane.add(L1);
typ = new JLabel("TYPE DE MACHINE"); typ.setBounds(40, 229, 450, 23);ContentPane.add(typ);

struct = new JLabel("SERVICE UTILISATEUR"); struct.setBounds(300, 15,250,23);
ContentPane.add(struct);
L2= new JLabel("Code");L2.setBounds(300,50, 500, 23);ContentPane.add(L2);
T2=new JTextField("");T2.setBounds(365, 50, 150, 23);ContentPane.add(T2);
L3= new JLabel("Nom");L3.setBounds(300,93, 500, 23);ContentPane.add(L3);
T3=new JTextField("");T3.setBounds(365, 93, 150, 23);ContentPane.add(T3);

L4 = new JLabel("RECEPTIONNISTE :");L4.setBounds(300, 146, 250, 23);ContentPane.add(L4);
L5= new JLabel("Matricule"); L5.setBounds(300, 176, 450, 23);ContentPane.add(L5);
T5=new JTextField("");T5.setText("");T5.setBounds(365, 176, 150, 23);ContentPane.add(T5);
L6= new JLabel("Nom");L6.setBounds(300, 219, 450, 23);ContentPane.add(L6);
T6=new JTextField(""); T6.setText("");T6.setBounds(365, 219, 150, 23);ContentPane.add(T6);
L7= new JLabel("Prenom");L7.setBounds(300,262, 450, 23);ContentPane.add(L7);
T7=new JTextField("");T7.setText("");T7.setBounds(365, 262, 150, 23);ContentPane.add(T7);

L8= new JLabel("Fonction");L8.setBounds(300,305, 450, 23);ContentPane.add(L8);
T8=new JTextField("");T8.setText("");T8.setBounds(365, 305, 150, 23);ContentPane.add(T8);

case1 = new JLabel();
case1.setBounds(40, 50, 450, 23);
case1.setText("Code");
ContentPane.add(case1);
//text1.setBackground(Color.cyan);
text1 = new JTextField();
text1.setBounds(100, 50, 150, 23);
text1.setText("");
ContentPane.add(text1);

case2 = new JLabel();
case2.setBounds(40, 93, 450, 23);
case2.setText("Nom");
ContentPane.add(case2);
text2 = new JTextField();
text2.setBounds(100, 93, 150, 23);
text2.setText("");
ContentPane.add(text2);

case3 = new JLabel();
case3.setBounds(40, 136, 450, 23);
case3.setText("Marque");
ContentPane.add(case3);
text3 = new JTextField();
text3.setBounds(100, 136, 150, 23);
text3.setText("");

case4 = new JLabel();
case4.setBounds(40, 176, 450, 23);
ContentPane.add(case4);
text4= new JTextField();
text4.setBounds(100, 176, 150, 23);
text4.setText("");
ContentPane.add(text4);

case5 = new JLabel();
case5.setBounds(40, 262, 450, 23);
case5.setText("Numero");
ContentPane.add(case5);
//getContentPane().add(new JLabel("Numero"));
text5 = new JTextField();
text5.setBounds(100, 262, 150, 23);
text5.setText("");
ContentPane.add(text5);

case6 = new JLabel("Type");
case6.setBounds(40, 305, 450, 23);
ContentPane.add(case6);
text6 = new JTextField("");
text6.setBounds(100, 305, 150, 23);
ContentPane.add(text6);
ContentPane.add(new JSeparator());

bouton1 = new JButton("Annuler"); bouton1.setBounds(140,348,100,23); ContentPane.add(bouton1);
bouton2 = new JButton("Enregistrer"); bouton2.setBounds(240,370,100,23); ContentPane.add(bouton2);
bouton3 = new JButton("Quitter"); bouton3.setBounds(340,348,100,23); ContentPane.add(bouton3);

Document doc1 = text1.getDocument();
Document doc2 = text2.getDocument();
try{
fluxwrite = new FileWriter("Machines.txt",true);// création du fichier(en mode ajout)
fluxout = new BufferedWriter(fluxwrite); //tampon de ligne associé
}
catch(IOException err){ System.out.println( "Problème dans l'ouverture du fichier ");}
//--> événements et écouteurs :
this.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
fluxout.close( ); //le fichier est fermé et le tampon vidé
}
catch(IOException err){ System.out.println( "Impossible de fermer le fichier ");}
System.exit(100);
}
});

doc1.addDocumentListener(
new javax.swing.event.DocumentListener() {
public void changedUpdate(DocumentEvent e) {}
public void removeUpdate(DocumentEvent e) {
textValueChanged(e);// appel au gestionnaire de changement de texte
}
public void insertUpdate(DocumentEvent e) {//une insertion est un changement de texte
textValueChanged(e);// appel au gestionnaire de changement de texte
}
});
doc2.addDocumentListener(
new javax.swing.event.DocumentListener() {
public void changedUpdate(DocumentEvent e) {}
public void removeUpdate(DocumentEvent e) {//une suppression est un changement de texte
textValueChanged(e);// appel au gestionnaire de changement de texte
}
public void insertUpdate(DocumentEvent e) {
textValueChanged(e);// appel au gestionnaire de changement de texte
}
});
bouton2.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
ecrireEnreg(text1.getText()+" | "+text2.getText());
}
});
}
//Gestionnaire du changement de texte dans un document
private void textValueChanged(DocumentEvent e) {
AutoriserSave();
}
}
0
Paps@
 
Slt java4ever, tu m'a pas oublié j'espère.
A propos j'ai trouvé solution à mon problème, il s'agissait de la méthode dispose() comme tu me l'a indiqué.
Seulement j'ai d'autres questions. Tu veux bien me répondre ?
0
java4ever
 
Bonjour, Paps@
Excuses moi, mais pour des question précises, je veux bien essayer de répondre. Pour debugger un programme entier, je sais le faire, mais ce n'est plus un jeu mais un métier.
Donc si tu as des questions claires, comme la première, pas de problème, j'essaierais, quand j'ai un peu de temps, d'y répondre Ok ?
0
Paps@
 
Bonjour java4ever, je te comprends...
Tu me disais tantôt qu'une interface est en gros une classe dont toutes les méthodes ont un corps vide à redéfinir au cas par cas.
Ces méthodes alors sont redéfinis où? dans une autre classe?
A titre d'exemple, le matricule que je saisi dans le champ JTextField doit être unique; la méthode qui gère l'unicité de celui-ci s'implémente où exactement
0