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

AWT/Swing Java Discussion :

IG JToggleButton variation de l'état


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut IG JToggleButton variation de l'état
    Bonjour Messieurs,

    J'ai un tout petit problème mais qui me prend la tête comme pas possible cela fait plusieurs heures que je cherche cette petite chose qui me bloque totalement...

    J'ai dans mon interface plusieurs JToggleButton, et je veux simplement mettre une valeur dans une variable si le bouton est enclenché et vider cette variable si le bouton n'est pas OU N'EST PLUS enclenché.

    Je sais je peux utiliser actionEvent avec ( if action sur bouton alors ma_varibale = ma_valeur et else ma_variable = null mais le pb avec ça est que si j'appuis une nouvelle fois sur mon bouton ( ce qui veut dire qu'il sera déselectionné ) alors ma_variable ne sera pas null est sera toujours égale à ma_valeur..

    Voila ce que je cherche :

    ma_variable = null;

    1er clique -> ma_variable = ma_valeur -> mon JToggleButton est Sélectionné
    2e clique -> ma_variable = null -> mon JToggleButton est Désélectionné
    3e clique -> ma_variable = ma_valeur -> mon JToggleButton est Sélectionné
    4e clique -> ma_variable = null -> mon JToggleButton est Désélectionné
    etc...

    Les technique du genre " tu as qu'a mettre un compteur nan merci ça peut le faire mais pas beau ^^' "

    Voila merci d'avance pour votre aide je peux poster mon code si besoin mais la je n'en voyais pas l'utilité!

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pour tester l'état d'un JToggleButton, tu peux utiliser la méthode isSelected().

    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
    26
    27
    28
    public class JToggleDemo extends JFrame {
     
    	private static final String MA_VALEUR = "VALEUR";
     
    	private String maVariable;
     
    	public JToggleDemo() {
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel panel = new JPanel(new GridBagLayout());
    		JToggleButton toggleButton = new JToggleButton("Clic-me");
    		toggleButton.addActionListener(e -> setMaVariable(toggleButton.isSelected() ? MA_VALEUR : null));
    		panel.add(toggleButton, new GridBagConstraints());
    		add(panel);
    		setSize(300, 300);
    		setLocationRelativeTo(null);
    	}
     
    	private void setMaVariable(String value) {
    		maVariable = value;
    		System.out.println(value);
    	}
     
    	public static void main(String[] args) {
    		JToggleDemo demo = new JToggleDemo();
    		demo.setVisible(true);
    	}
     
    }
    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
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Salut Joel ! Merci pour la reponse je vois que t'es toujours à mon écoute

    J'ai essayé d'adapter ce que tu as posté à mon programme mais le pb est toujours le meme ( au 1er clik sur le bouton aucune reaction c'est seulement après le 2nd clik que le bouton affiche sa valeur ) alors que quand je test ton code seul ca fonctionne à la perfection exactement comme je le souhaite! Il y a un donc un pb de mon côté je vais chercher en tt cas encore merci pour la solution

  4. #4
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    J'arrive maintenant à obtenir une valeur dès le 1er "clik" mais avec une mauvaise valeur. Au 1er clik je dois avoir ma variable avec LIN+ sauf que la j'ai null

    Voici mon code au cas ou :
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.io.*;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import javax.swing.*;
     
     
    public class intergraph extends JFrame implements ActionListener{                               //-------------------VARIABLES & BOUTONS-------------------//
     
     
    	static JButton validerbutton;              // Déclaration des boutons
    	static JButton exportation;	
    	static JButton annulation;	
    	static JButton effacer;
     
    	static JToggleButton choix;
    	static JToggleButton choix2;
    	static JToggleButton choix3;
     
    	static String word;
    	static String word2;
    	static String word3;
     
    	static JTextArea jta;
    	static JScrollPane sp;
    	static File fichier = null;
     
    	JPanel pano = new JPanel();               // Jpanel pour placer l'afficheur 
    	JPanel eastPano = new JPanel();           // Jpanel pour placer les boutons 
     
     
    	public intergraph(){		 							                                    //-------------------INTERFACE GRAPHIQUE-------------------//
     
    		setSize(300, 220);	                                            // Définit sa taille : 400 pixels de large et 100 pixels de haut
    		setTitle("Data extraction");	                                // Définit un titre pour notre fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                 // Termine le processus lorsqu'on clique sur la croix rouge	            		
     
    		eastPano       = new JPanel();        
    		pano           = new JPanel();
    		jta            = new JTextArea();
    		jta.setFocusable(false);
     
    		choix          = new JToggleButton("LIN+");
    		choix.addActionListener(e -> setMaVariable(choix.isSelected() ? word : null));
    		choix2         = new JToggleButton("RFF+ADE");
    		choix3         = new JToggleButton("RFF+MH");	
    		validerbutton  = new JButton("Valider");
    		exportation    = new JButton("Excel");
    		annulation     = new JButton("Annuler");
    		effacer        = new JButton("Effacer");
     
    		jta.setLayout(new GridLayout());
    		pano.setLayout(new GridLayout(7,1));                           // Ligne,Colonne
    		eastPano.setLayout(new GridBagLayout());
     
     
    		//choix.addActionListener(this);                                  // Mise en place de l'écoute des boutons 
    		choix2.addActionListener(this);
    		choix3.addActionListener(this);
    		validerbutton.addActionListener(this);
    		annulation.addActionListener(this);
    		//exportation.addItemListener(this);
    		effacer.addActionListener(this);
     
    		pano.add(choix);												// Ajout des boutons au JPanel pano
    		pano.add(choix2);
    		pano.add(choix3);
    		pano.add(validerbutton);
    		pano.add(effacer);                              
    		pano.add(exportation);
    		pano.add(annulation);		
     
    		add(pano);
    		add(eastPano, BorderLayout.EAST);
     
    		eastPano.add(pano, new GridBagConstraints());
     
    		ouvertureExplo();
    		setVisible(true); 
     
    		jta.setLineWrap(true);
    	    jta.setWrapStyleWord(false);
    	    jta.setSize(new Dimension(1265,1));
    	    JScrollPane pane = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
     
    	    setExtendedState(JFrame.MAXIMIZED_BOTH);
     
    	    getContentPane().add(pane, BorderLayout.WEST);
     
    	}
    	private void setMaVariable(String value) {
    		word = "LIN+";
    		System.out.println(value);
    	}
     
    	public void actionListener(ActionEvent e) {												   //----------GESTION DES ACTIONS SUR LES BOUTONS------------//	   
     
    	/*	if (e.getSource()== choix){  
    			choix.addActionListener(a -> setMaVariable(choix.isSelected() ? word : null));   
    		}				
    	*/	
    		if (e.getSource()== choix2){        
    			word2 = "RFF+ADE";          
    			System.out.println(word2);
    		}
     
    		if (e.getSource()== choix3){        
    			word3 = "RFF+MH";          
    			System.out.println(word3);
    		}
     
    		if (e.getSource()== annulation){                 
    			System.exit(0);
    		}
     
    		if (e.getSource()== effacer){        
    			jta.setText("");
    		}
     
    		if (e.getSource()== validerbutton){
    			System.out.println("Extraction : "+word+" / "+word2+ " / "+word3);
    			try {
    				extractionData();
    			}
    			catch (IOException e1){
    			 e1.printStackTrace();
    			}
    		}
    	}
     
    	public void ouvertureExplo(){                                                               //------------------EXPLORATEUR DE FICHIER-----------------//
     
    		JFileChooser explorateur = new JFileChooser(new File("C:/Users/1cambien/Desktop/Test"));
     
    		if (explorateur.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { // si l'instruction showOpenDialog renvoie APPROVE_OPTION 
    			fichier = explorateur.getSelectedFile();
    		}
    	}
     
    	public void extractionData() throws IOException{                                            //------------------EXTRACTION DES DONNEES-----------------//
     
    		int nb = 0;
    		String pathToFile = ""+fichier;
    		Path path = Paths.get(pathToFile);
     
    		try(BufferedReader reader = Files.newBufferedReader(path)) {					// Lecture fichier
     
    			for(String line = reader.readLine(); line!=null; ) {
    				nb++; 	                                                                // Compteur nombre de ligne	
    				if ( nb>1 ); break;			 										    // Inutile de lire plus loin
    			}
    		}		 
     
    		try(BufferedReader reader = Files.newBufferedReader(path)) { 	
    			for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
     
    				if ( nb>1 ) { 															// si ligne > 1 on traite les lignes qui commencent par "word"
    					if ( line.startsWith(word)) { 
    					    extractValue(line, 4, 0);			    	    
    					}
    				}						
    				else {
    					convertir(line, word, word2,word3);	
    				} 
    			}							 
    		}
    	}
     
    	private static void convertir(String file, String word,String word2, String word3) throws IOException {   //---------------FORMATTAGE STRUCTURE FICHIER--------------//
     
    		for(String line : file.split("'") ) { // on découpe par rapport à ', inutile de convertir en ligne pour parser des lignes (comme on a forcément qu'une ligne au plus, il n'y a aucun séparateur de ligne)	
    			if(word!=null){		
    				if ( line.startsWith(word)) {     // LIN
    					extractValue(line,4, 0);
    				}
    			}		
    			if(word2!=null){	
    				if ( line.startsWith(word2)) {    // RFF+ADE
    					extractValue2(line);
    				}
    			}
    			if(word3!=null){
    				if ( line.startsWith(word3)) {    // RFF+MH		
    					extractValue3(line);					
    				}
    			}
    		}		
    	}	
     
    	private static void extractValue(String line, int field, int composite) throws IOException{ //----------------SELECTION CHAMP & COMPOSITE--------------//
     
    	int i=0;
    	int cptplus = 0;				
    	char first = line.charAt(i);	
    	jta.append("\n");
    	jta.append("Part n° : ");	
    		while (i < line.length()){	
    			first = line.charAt(i);
    			i++;	
     
    			if(first == '+'){
    				cptplus++;
     
    				while (cptplus >= field--){
    					first = line.charAt(i);
    					jta.append(""+line.charAt(i));
    					i++;
     
    					if ( first == '+' || first == '\'' || first == ':'){
    						jta.append(" ; ");	
    						break;			
    					}
    				}
    			}
    		}		
    	}
    	private static void extractValue2(String line) throws IOException{ //RFF+ADE-------------SELECTION CHAMP & COMPOSITE--------------//
     
    		int i=0;
    		int cptpoint = 0;				
    		char first2 = line.charAt(i);	
    		jta.append("Supplier code : ");
     
    		while (i < line.length()){	
    			first2 = line.charAt(i);
    			i++;	
     
    			if(first2 == ':'){
    				cptpoint++;
     
    				while (cptpoint >= 1){
    					first2 = line.charAt(i);
    					jta.append(""+line.charAt(i));
    					i++;
     
    					if (i >= line.length()){
    						jta.append(" ; ");
    						break;	
    					}
    				}
    			}
    		}		
    	}
    	private static void extractValue3(String line) throws IOException{ //RFF+MH-------------SELECTION CHAMP & COMPOSITE--------------//
     
    		int i=0;
    		int cptpoint = 0;				
    		char first3 = line.charAt(i);	
    		jta.append("Fab order : ");
     
    		while (i < line.length()){	
    			first3 = line.charAt(i);
    			i++;	
     
    			if(first3 == ':'){
    				cptpoint++;
     
    				while (cptpoint < 2){
    					first3 = line.charAt(i);
    					jta.append(""+line.charAt(i));
    					i++;
     
    					if (i >= line.length()){
    						jta.append(" ; ");
    						break;	
    					}
    				}
    			}
    		}		
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    }

  5. #5
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ton écouteur choix.addActionListener(e -> setMaVariable(choix.isSelected() ? word : null)); fait quoi ? Il passe word si le bouton est sélectionné, ou null sinon. Au premier clic, le bouton devient sélectionné, donc il passe word. Donc voyons ce que vaut word : le seul endroit où word est affecté, c'est justement dans la méthode setMaVariable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void setMaVariable(String value) {
    		word = "LIN+";
    		System.out.println(value);
    	}
    Donc, au premier clic, word vaut forcément null.

    Ta méthode setMaVariable n'est pas logique : son but c'est, si je comprends bien, de dire que word est "LIN+". Donc, tu devrais plutôt avoir, à priori :

    On dit que quand on clique, word devien "LIN+"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choix.addActionListener(e -> setMaVariable(choix.isSelected() ? "LIN+" : null))
    (ou plus logiquement : choix.addActionListener(e -> setWord(choix.isSelected() ? "LIN+" : null)), parce que c'est quand même plus compréhensible si le nom de la méthode a un rapport avec ce qu'elle fait. A voir, par ailleurs, pourquoi passer null dans le cas non sélectionné, dans la logique de l'ensemble, mais comme je ne sais pas ce que tu cherches à faire exactement, je ne sais pas dire ce qu'il vaudrait mieux faire et ton code est fastidieux à comprendre. Je subodore que tu devrais plutôt utiliser des radiobuttons plutôt que des togglebuttons, mais sans savoir le but de tout ça, je ne pourrais confirmer).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void setMaVariable(String value) { 
    		word = value; // on affecte word avec la valeur du paramètre
    		//System.out.println(value);
    	}
    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.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Bonjour Joel !
    Ok je comprends mieux, en ft j'avais du mal à saisir completement le fonctionnement de cette ligne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     choix.addActionListener(e -> setMaVariable(choix.isSelected() ? "LIN+" : null))
    Je te poste un screen de mon interface ça ne pourra qu'être mieux pour la comprenhension du programme.
    ( Je sais que mon code est très fatiguant à lire désolé, j'ai encore du mal à bien structurer et honnêtement j'ai pas trop le courage de repartir a 0 pour l'organiser ^^).

    Voici le screen :
    Nom : IG.png
Affichages : 637
Taille : 33,7 Ko

    Du coup voila le bout de mon programme à jour avec correction des grosses incohérences !
    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
    public intergraph(){		 							                                    //-------------------INTERFACE GRAPHIQUE-------------------//
     
    		setSize(300, 220);	                                            // Définit sa taille : 400 pixels de large et 100 pixels de haut
    		setTitle("Data extraction");	                                // Définit un titre pour notre fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                 // Termine le processus lorsqu'on clique sur la croix rouge	            		
     
    		eastPano       = new JPanel();        
    		pano           = new JPanel();
    		jta            = new JTextArea();
    		jta.setFocusable(false);
     
    		choix  = new JCheckBox("LIN+");
    		choix.addActionListener(e -> setWord(choix.isSelected() ? "LIN" : null));
     
    		choix2 = new JCheckBox("RFF+ADE");
    		choix2.addActionListener(e -> setWord2(choix2.isSelected() ? "RFF+ADE" : null));
     
    		choix3 = new JCheckBox("RFF+MH");	
    		choix3.addActionListener(e -> setWord3(choix3.isSelected() ? "RFF+MH" : null));
     
    		validerbutton  = new JButton("Valider");
    		exportation    = new JButton("Excel");
    		annulation     = new JButton("Annuler");
    		effacer        = new JButton("Effacer");
     
    		jta.setLayout(new GridLayout());
    		pano.setLayout(new GridLayout(9,1));                           // Ligne,Colonne
    		eastPano.setLayout(new GridBagLayout());
     
    		validerbutton.addActionListener(this);
    		annulation.addActionListener(this);
    		exportation.addActionListener(this);
    		effacer.addActionListener(this);
     
     
    		pano.add(choix);												// Ajout des boutons au JPanel pano
    		pano.add(choix2);
    		pano.add(choix3);
    		pano.add(validerbutton);
    		pano.add(effacer);                              
    		pano.add(exportation);
    		pano.add(annulation);		
     
    		add(pano);
    		add(eastPano, BorderLayout.EAST);
     
    		eastPano.add(pano, new GridBagConstraints());
     
    		ouvertureExplo();
    		setVisible(true); 
     
    		jta.setLineWrap(true);
    	    jta.setWrapStyleWord(false);
    	    jta.setSize(new Dimension(1250,1));
     
    	    JScrollPane pane = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 	    
    	    setExtendedState(JFrame.MAXIMIZED_BOTH);    
    	    getContentPane().add(pane, BorderLayout.WEST);
    	}
     
    	private void setWord(String value) {
    		word = value;
    		System.out.println(value);
    	}
    	private void setWord2(String value2) {
    		word2 = value2;
    		System.out.println(value2);
    	}
    	private void setWord3(String value3) {
    		word3 = value3;
    		System.out.println(value3);
    	}
    En tout cas au top tes conseils Joel, merci beaucoup
    La dernière étape de mon programme concerne l'exportation du resultat vers un fichier .txt donc il est possible que je revienne vers toi une ultime fois

  7. #7
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    OK, je vois mieux : tu veux pouvoir filtrer tes extractions. Soit tu veux pouvoir filtrer sur un seul type à la fois, soit tu veux pouvoir filtrer sur plusieurs types en même temps.

    Dans le second cas, des checkbox sont adaptées, mais ta méthode ne l'est pas : il faudrait avoir plusieurs "words" en même temps, donc forcément une collection ou un tableau, le Set étant le plus adapté.
    Et tu aurais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    choix.addActionListener(e -> {
    if ( choix.isSelected() ) {
          addFilter("LIN+");
    }
    else {
          removeFilter("LIN+");
    }
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Set<String> wordFilter = new HashSet<>();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void addFilter(String filter) {
        wordFilter.add(filter);
    }
    private void removeFilter(String filter) {
        wordFilter.remove(filter);
    }
    Cela rend un peu plus compliqué ton traitement de la sélection. Comme tu as que trois mots, on peut se contenter à la rigueur d'avoir trois variables comme tu l'as fait, mais s'il y'en avait beaucoup plus, il faudrait envisager une approche différente, 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
    private static void convertir(String file, String word,String word2, String word3) throws IOException {   //---------------FORMATTAGE STRUCTURE FICHIER--------------//
     
    		for(String line : file.split("'") ) { // on découpe par rapport à ', inutile de convertir en ligne pour parser des lignes (comme on a forcément qu'une ligne au plus, il n'y a aucun séparateur de ligne)	
                            for(String word : wordFilter) {
                                if ( line.startsWith(word)) {     
                                     switch( word ) { // ou une map (surtout si plus de 3 valeurs différentes), un Map<String, Consumer<String>> par exemple
                                           case "LIN+":
                                                extractValue(line,4, 0);
                                                break;
                                           case "RFF+ADE":
                                                 extractValue2(line);
                                                 break;
                                           case "RFF+MH	":
                                                 extractValue3(line);
                                                 break;
                                     }
                                     break;
                                }
                            }
    		}		
    	}
    S'il n'y a qu'une seule valeur possible à la fois (premier cas), des radio button seraient plus adaptés (il ne peut y en avoir qu'un seul sélectionné à la fois).

    Il y a la particulité de word, qui sert dans deux conditions de filtre : il faut modifier le sélecteur spécifique de choix pour qu'il affecte aussi word. Il y a d'autres solutions, mais je pense qu'elles sont plus complexes, ou alors il faut vraiment plus séparer la partie découpage du flux, et la partie traitement de l'extraction.

    Maintenant, la solution qui me semble meilleure que de jouer avec des variables word, word1, word2... et de tester directement la sélection au moment du filtre, dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
                                    if ( choix.isSelected() && line.startsWith("LIN+") ) {
                                           extractValue(line, 4, 0);		
                                    }
    Tu peux même le traiter dans une boucle, en utilisant la propriété actionComand de JCheckBox/JToggleButton


    Enfin, attention : si word est null, ce qui suit va planter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( nb>1 ) { 															// si ligne > 1 on traite les lignes qui commencent par "word"
    					if ( line.startsWith(word)) { 
    					    extractValue(line, 4, 0);			    	    
    					}
    				}
    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.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Alors mon programme doit être capable d'extraire chaque donnée soit indépendament les unes des autres, soit par 2, voir les 3 en même temps.
    Du coup l'utilisation des radiobutton n'est pas possible, en générale plusieurs choix seront effectués.

    En effet par la suite je vais avoir des types de donnée autres que les "LIN","RFF+MH","RFF+ADE", du coup une fois de plus ton conseil et très utile en ce qui concerne la methode "convertir"
    Par contre si l'extraction n'est pas exactement la même pour chaque type de donnée (ex bidon : pour LIN, extract° du 1er au 8e char & pour RFF, extract° de 3e au 6e char), je vais avoir une methode extractValue par type.. Je pense que je vais pas avoir plus de 10 types à traiter mais j'ai pas eu de chiffre précis concernant ceci!
    Bon la de suite je comprends pas à 100% tout ce que tu essayes de m'expliquer du moins comment mettre tout ça en place dans mon programme pour les tableaux etc, je vais prendre le temps de comprendre et appliquer tout ça.
    Je reviens poster le resultat une fois terminé!
    Merci encore !

  9. #9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Voilà ce que ça pourrait donner avec une Map (j'en ai profité pour simplifier ton extractValue2 et extractValue3) :

    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    public class Extractor {
     
    	// une map qui va associer un mot avec un extracteur de données
    	private final static Map<String, IExtractor> EXTRACTORS = createMap();
     
    	/**
             * 
             * @param path le chemin de fichier
             * @param appendable un appendable pour collecter le résultat
             * @param words les mots dé début de ligne qu'on veut extraire
             * @throws IOException
             */
    	public Extractor(Path path, Appendable appendable, String...words) throws IOException {
     
    		// on ne conserve que les filtres qu'on a sélectionnés
    		Map<String, IExtractor> extractors = new HashMap<>();
    		for(String word : words) {
    			IExtractor extractor = EXTRACTORS.get(word); 
    			if ( extractor!=null ) {
    				extractors.put(word, extractor);
    			}
    		}
     
    		// on compte le nombre de ligne
    		int nb = 0;
    		try (BufferedReader reader = Files.newBufferedReader(path)) { // Lecture
    																		// fichier
     
    			for (String line = reader.readLine(); line != null;) {
    				nb++; // Compteur nombre de ligne
    				if (nb > 1)
    					;
    				break; // Inutile de lire plus loin
    			}
    		}
     
    		if (nb == 1) { // si le fichier n'a qu'une seule line
    			try (BufferedReader reader = Files.newBufferedReader(path)) {
    				for (String line : reader.readLine().split("\n")) { // on la lit et on la découpe en lignes  avec \n
    					extract(line, appendable, extractors); // on traite chaque sous-ligne
    				}
    			}
    		} else {
    			try (BufferedReader reader = Files.newBufferedReader(path)) {
    				for (String line = reader.readLine(); line != null; line = reader.readLine()) {
    					EXTRACTORS.get("LIN+").extract(line, appendable); // on n'extrait que  par le mot LIN+
    				}
    			}
    		}
    	}
     
    	// on construit la map des composants d'extraction
    	private void extract(String line, Appendable appendable, Map<String, IExtractor> extractors) {
    		for (Map.Entry<String, IExtractor> entry : extractors.entrySet()) {  // on parcourt toutes les associations
    			if (line.startsWith(entry.getKey())) { // si la clef est le début de la ligne
    				entry.getValue().extract(line, appendable); // on fait l'extraction associée
    				break; // on a trouvé la bonne association, on peut arrêter toute de suite et passer à la ligne suivante
    			}
    		}
    	}
     
    	// on construit une fois la map
    	private static Map<String, IExtractor> createMap() {
    		Map<String, IExtractor> extractor = new HashMap<>();
    		// on ajoute pour chaque mot, un extracteur associé
    		extractor.put("LIN+", Extractor::extractLinValue); // dit qu'on appellera la méthode extractLinValue lorsque le mot sera LIN+
    		extractor.put("RFF+ADE", Extractor::extractRffAdeValue);
    		extractor.put("RFF+MH", Extractor::extractRffMhValue);
    		return Collections.unmodifiableMap(extractor);
    	}
     
    	private static void extractLinValue(String line, Appendable appendable) {
    		try {
    			extractValue(line, appendable, 4, 0);
    		} catch (IOException e) {
    			throw new UncheckedIOException(e);
    		}
    	}
     
    	private static void extractRffAdeValue(String line, Appendable appendable) {
    		try {
    			extractValue2(line, appendable);
    		} catch (IOException e) {
    			throw new UncheckedIOException(e);
    		}
    	}
     
    	private static void extractRffMhValue(String line, Appendable appendable) {
    		try {
    			extractValue3(line, appendable);
    		} catch (IOException e) {
    			throw new UncheckedIOException(e);
    		}
    	}
     
    	// tes trois méthodes, corrigées
    	private static void extractValue(String line, Appendable appendable, int field, int composite) throws IOException {
     
    		int i = 0;
    		int cptplus = 0;
    		char first = line.charAt(i);
    		appendable.append("\n");
    		appendable.append("Part n° : ");
    		while (i < line.length()) {
    			first = line.charAt(i);
    			i++;
     
    			if (first == '+') {
    				cptplus++;
     
    				while (cptplus >= field-- && i< line.length()) {
    					first = line.charAt(i);
    					appendable.append(first);
    					i++;
     
    					if (first == '+' || first == '\'' || first == ':') {
    						appendable.append(" ; ");
    						break;
    					}
    				}
    			}
    		}
    	}
    	private static void extractValue2(String line, Appendable appendable) throws IOException{ //RFF+ADE-------------SELECTION CHAMP & COMPOSITE--------------//
     
    		//		ça fonctionne, mais on peut faire mieux, plus concis, plus efficace, et plus logique (voir juste après)
     
    		/*
    		int i=0;
    		int cptpoint = 0;				
    		char first2 = line.charAt(i);	
    		appendable.append("Supplier code : ");
     
    		while (i < line.length()){	
    			first2 = line.charAt(i);
    			i++;	
     
    			if(first2 == ':'){
    				cptpoint++;
     
    				while (cptpoint >= 1){
    					first2 = line.charAt(i); 
    					appendable.append(line.charAt(i));
    					i++;
     
    					if (i >= line.length()){
    						appendable.append(" ; ");
    						break;	
    					}
    				}
    			}
    		}		*/
    		int cptpoint = 0;	
    		for(int i=0; i<line.length(); i++) {
    			if ( line.charAt(i)==':' ) {
    				cptpoint++;
    				if ( cptpoint>0 ) {
    					appendable.append(line.substring(++i));
    				}
    			}
    		}
     
     
    	}
    	private static void extractValue3(String line, Appendable appendable) throws IOException{ //RFF+MH-------------SELECTION CHAMP & COMPOSITE--------------//
     
    		//		ça fonctionne, mais on peut faire mieux, plus concis, plus efficace, et plus logique (voir juste après)
     
    		/*int i=0;
    		int cptpoint = 0;
    		char first3 = line.charAt(i);	
    		appendable.append("Fab order : ");
     		
    		while (i < line.length()){	
    			first3 = line.charAt(i);
    			i++;	
     
    			if(first3 == ':'){
    				cptpoint++; // commenté ne sert à rien
     
    				while (cptpoint < 2){
    					first3 = line.charAt(i); // j'ai commenté ça parce que ça ne sert à rien
    					appendable.append(line.charAt(i));
    					i++;
     
    					if (i >= line.length()){
    						appendable.append(" ; ");
    						break;	
    					}
    				}
    				appendable.append(line.substring(i));
     
    			}
    		}*/
    		int pos = line.indexOf(':'); // recherche position de :
    		if ( pos>= 0 ) { // si on a trouvé :
    			appendable.append(line.substring(++pos)); // on récupère ce qui se trouve après :
    		}
     
    	}
     
    	private interface IExtractor {
     
    		void extract(String line, Appendable appendable);
     
    	}
     
    }
    à utiliser comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Path path = Paths.get(pathToFile);
     
    		try {
    			new Extractor(path, new JTextAreaAppendable(jta), word, word2, word3);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}

    avec
    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
    public class JTextAreaAppendable implements Appendable {
     
    	private final JTextArea textArea;
     
    	public JTextAreaAppendable(JTextArea textArea) {
    		this.textArea=textArea;
    	}
     
    	@Override
    	public Appendable append(CharSequence text) throws IOException {
    		if ( text!=null ) {
    			textArea.append(text.toString());
    		}
    		return this;
    	}
     
    	@Override
    	public Appendable append(CharSequence text, int offset, int length) throws IOException {
    		if ( text!=null ) {
    			textArea.append(text.subSequence(offset, length).toString());
    		}
    		return this;
    	}
     
    	@Override
    	public Appendable append(char c) throws IOException {
    		textArea.append(String.valueOf(c));
    		return this;
    	}
     
    }
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringBuilder sb=new StringBuilder();
     
    		try {
    			new Extractor(path, sb, word, word2, word3);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		String string = sb.toString();
    Tu récupéreras le résultat dans une String

    Et comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try( BufferedWriter writer = Files.newBufferedWriter(filepath, StandardCharsets.UTF_8)) {
    			new Extractor(path, writer, word, word2, word3);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    Directement dans un fichier... pour montrer que combien utiliser un Appendable peut être pratique (à part pour le JTextArea).


    Pour le résultat on console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	try  {
    			new Extractor(path, System.out, word, word2, word3);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    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.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    ENORME merci pour ton temps et ton implication Joel!
    Bon la par contre c'est très compliqué pour moi de tout saisir beaucoup trop de chose nouvelles choses il va me falloir un petit peu de temps pour tout assimiler
    Par contre les extractValue2,3 super, je comprends très bien les modifs ça semble tellement logique maintenant.
    Je tente d'appliquer ça à mon programme et je poste le resultat!

    Merci à très vite

  11. #11
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Danoob80 Voir le message
    Par contre les extractValue2,3 super, je comprends très bien les modifs ça semble tellement logique maintenant.
    Je crois que j'oublié de reprendre l'ajout du ; à la fin, mais tu dois pouvoir le remettre assez facilement (juste un append à faire).
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul de variation entre deux années (état)
    Par haithamoo dans le forum Access
    Réponses: 3
    Dernier message: 18/05/2016, 09h51
  2. Variation d'état d'un contrôle sans l'activer
    Par Neutthsch dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/02/2016, 10h01
  3. [CR][VB6] Impression d'un état depuis VB
    Par sda dans le forum SDK
    Réponses: 3
    Dernier message: 06/02/2007, 17h27
  4. [CR][VB] comment générer un état ?
    Par ndi dans le forum SDK
    Réponses: 3
    Dernier message: 22/08/2002, 13h13
  5. Réponses: 5
    Dernier message: 08/07/2002, 16h22

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