DOC SWING

Lorsque l'on utilise un jliste ne jamsi partager le meme model entre 2 jlist reporter les changement de model sur les 2 model
Si vous le faite seul la derniere jlist sera rafraichie l'autre sera dans un etat zombie

Step1 JFrame

Codeswing
Step1
Step1JFrame Le premier code Brut.java est l'exemple le plus simple pour faire un jframe fonctionel
Code part1:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
  public void run() {
  
A pour but de transferer au thread (tache séparé) spécialisé la gestion de notre gui (afin qu'elle restte reactive et toujours diponible)
setTitle("Title Brut"); //title titre
setSize(320,200); //size of the jframe taile de la jframe
setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
setResizable(false); //On interdit la redimensionnement de la fenêtre
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
setVisible(true); //rend visible jframe
Pour le moment c'est un peux en vrac On utilisera le model MVC plus tard quand vous maitriserez la base de swing

Explication Théorique

Contenaire 1er niveaux
JFrame,JWindows,JDialog,JApplet
Contenaire 2éme rang
JPanel,JScroll,JSplit,....
Objet finaux Jbutton,JField,JTextField,JList,..
Contenaire = objet graphique pouvant contenir un ou plusieur autre objet (graphique)
Il faut D'abord placer un contenaire de 1er niveaux
Ils peuvent embarquer des composants finaux ou des contenaires de 2éme niveaux
Ensuite on empbarque dedans des contenaires de 2émé niveaux ou des objets finaux sur n level

Step2 JSplitPane

code step2
Step1JFrame Cette expample montre comment embarqué des composants les 1 dans les autres sans gestion du layout
add(getJSplitPane());
Permet d'embarquer le JSplitPane dans l'objet JFrame
JSplitPane jsp= new JSplitPane(); //un conteneur ayant 2 zonereglable et des ascenceurs
jsp.setAutoscrolls(true); //permet de faire apparaitre un assenseur sur le cotes si besoins
jsp.setDividerLocation(200); //place la barre verticale deplacable
jsp.setOrientation(JSplitPane.HORIZONTAL_SPLIT); // on peux en faire des horizontaux
jsp.setLeftComponent(getJList()); //on charge un composant finale

Step3 GroupLayout

code step3 Un layout est la facons de ranger les objet chaque contenaire peux avoir un layout different
Il existe de nombre layout, le layout par defautl et le border layout
pour le moment je ne le present pas faute de temps (il est simple)

Schema

Je vous conseille de faire un schema a chaque fois un gribouillage representent les label bouton panel scrolle pane ect
De marquer les partie en serie et parralele
Pour faire simple pour definir les regle horizontal on ecrit a droite si on fais des fleches c'est que les objet sotn parallele
Si on fais des pacquet (cercle) les objet sont serie
On procede de la meme facon pour les regles verticale en ce placent en dessous
step 3
GroupLayout

Step3 Layout Setup

GroupLayout layout = new GroupLayout(jpanel);
jpanel.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
Creation du gestion de layout
On l'atribut au jpanel
On autorise la creation d'espace entre les composansts le gestionaire fais le taf a votre place

Regle Horizontal

SequentialGroup hGroup = layout.createSequentialGroup();	
  hGroup.addComponent(jb1);
  hGroup.addComponent(jl1);
layout.setHorizontalGroup(hGroup);	
sequential signifiant ce suivant apret on place les composant devant ce suivre

Regle Vertical

	
ParallelGroup vGroup= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
  vGroup.addComponent(jb1);
  vGroup.addComponent(jl1);
layout.setVerticalGroup(vGroup);
Pour l'arangement verticale on place un 1er groupe sequenciel (obligatoir) puis on dit que l'on va ajouter un group aligné
GroupLayout.Alignment.BASELINE element aligner depuis leur point de depart

Formatage Du code

LSun presente un autre formatage je vous le deconseille car il n'est pas pratique pour faire des boucles
layout.setHorizontalGroup(
  layout.createSequentialGroup()
    .addComponent(jb1)
    .addComponent(jl1)	
);
layout.setVerticalGroup(
  layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
    .addComponent(jb1)
    .addComponent(jl1)
);
step 3a
GroupLayout

Step 3a

ParallelGroup hGroup= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
	hGroup.addComponent(jb);
	hGroup.addComponent(jl);
layout.setHorizontalGroup(hGroup);	
SequentialGroup vGroup = layout.createSequentialGroup();	
	vGroup.addComponent(jb);
	vGroup.addComponent(jl);
layout.setVerticalGroup(vGroup);
Si vous n'avais pas comprits a ce stade pour quoi les composants sont dans ce sens inutil de continuer
Cassez vous la tete copier coller mon code jouer avec
step 3b
GroupLayout

Step 3b

La seul difference est que l'on a forcé la taille des composants (j'ais rajouté de la couleur pour le voir)
A noter bioen que contraindre un jlist en taille est une mauvaise idée si le modelle n'est pas contraint ceci est une exemple
0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE sgnifie tu a le droit de varié en tailel de zero à l'infini(vue la resolution des ecrans)
Noté bien que le composant prendra donc la taille du parent et varira avec lui
150, 150,150 tu a le droit de varié de la taille 150px a 150 px bref on le fix
ParallelGroup hGroup= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
	hGroup.addComponent(jb,0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
	hGroup.addComponent(jl,0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
layout.setHorizontalGroup(hGroup);	
SequentialGroup vGroup = layout.createSequentialGroup();	
	vGroup.addComponent(jb);
	vGroup.addComponent(jl,150, 150,150);
layout.setVerticalGroup(vGroup);
utiliser mon code jouer avec
Exercice: rendez la jlist redimensionable verticalement agrandissez la fenetre elle devrais suivre

Step4 Toolbar

code step4
Step4 1er remarque j'ais changer la facon de gérer le JFrame je n'etent plus la class jframe mais utilise l'objet
C'est pareille a chacun de trouver son style

IMPORTANT
Notez que les instructions si dessou on disparue
setSize(640,480); //indique la size
setResizable(false); //la verouille
On utilise a la place jframe.pack()
jframe.pack();
Cette instruction de taille indique que la taille de la Jframe est reglé par les composants contenue
Step4 Le border layout est consititué de 5 zone
BorderLayout.PAGE_START
BorderLayout.CENTER
BorderLayout.LINE_START
BorderLayout.PAGE_END
BorderLayout.LINE_END
On place nos composant autour de la zone centrel (border)

Step5 Action/Layout

code step5
Step5

Instrumenter le bouton

Dans la methode getJButton
jbutton.setActionCommand("newProject");
jbutton.addActionListener(this);
Le premier definit le nom de l'action le deuxieme indique que le code a runner est dans la class
Il fayut donc implementer actionlistener
public class MyGui5 implements ActionListener{
Step5

Implementation Methode actionPerformed

La methode actionPerformed est lancé dés qu'une action est faite sur un boutton
public void actionPerformed(ActionEvent e) {
 System.out.println(e.getActionCommand());	
 if ("newProject".equals(e.getActionCommand())) {
  System.out.println("newProject catch");
  JOptionPane.showMessageDialog(null,
    "Test1", "New Project", JOptionPane.INFORMATION_MESSAGE); 
 }else{
  System.out.println("not yet implemented");
 }
}
J'ais choisi d'appeler en cas d'apuis sur le bouton joption pane qui m'ouvre une boitte dialogue

Step5a JDialog JList

 if ("newProject".equals(e.getActionCommand())) {
	nomatch=false;
	//System.out.println("newProject catch");
	jdialoguenp = new JDialog(jframe,"New Project",true);
	jdialoguenp.setSize(300,150);
	jdialoguenp.setResizable(false);
	
	jdialoguenp.setLocationRelativeTo(jframe);
	jdialoguenp.add(getJpannelNP());
	jdialoguenp.setVisible(true);			 
}
Le passage au Jdialog permet de choisir complétement le contenue de sa boitte de dialogue
En effet le JDialog est un contenaire au meme titre que le jframe il peux donc contenir ce que le'on veux
Noter le bloquage de la taille du jdialogue qui permet de mieux metriser le layout
Agencement 1 mal foutue
Step5

Layout du JDialogue

Affichage 1

ParallelGroup hGroup= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
  SequentialGroup hsg= layout.createSequentialGroup();
    hsg.addComponent(jlabel);
    hsg.addComponent(jtextfieldnp);
  hGroup.addGroup(hsg);
  hsg= layout.createSequentialGroup();
    hsg.addComponent(jbutton);
    hsg.addComponent(jbuttoncancel);
  hGroup.addGroup(hsg);
layout.setHorizontalGroup(hGroup);

ParallelGroup vGroup = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
  SequentialGroup vsg= layout.createSequentialGroup();
    vsg.addComponent(jlabel,20,20,20);
    vsg.addComponent(jbutton,20,20,20);
  vGroup.addGroup(vsg);
  vsg= layout.createSequentialGroup();
    vsg.addComponent(jtextfieldnp,20,20,20);
    vsg.addComponent(jbuttoncancel,20,20,20);
  vGroup.addGroup(vsg);
layout.setVerticalGroup(vGroup);		
Cela ne me va pas car les bouttons sont tassé.
Cela provient du faite que sur les regle horizontal on a placé les label+text field ensemble en sequence et les 2boutons en seq puis regrouper sur un prarallele
Agencement 2 revue
Step5

Affichage 2

Voici le code modifier suivant le schema les bt sont aligné avec les debuts de composants
SequentialGroup hGroup= layout.createSequentialGroup();
  ParallelGroup hg= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hg.addComponent(jlabel);
    hg.addComponent(jbutton);
  hGroup.addGroup(hg);
  hg= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hg.addComponent(jtextfieldnp);
    hg.addComponent(jbuttoncancel);
  hGroup.addGroup(hg);
layout.setHorizontalGroup(hGroup);
Agencement 3 centrage
Step5

Affichage 3

Methode: getJpannelAffichage3()
Pour aligné les boutton au centre des comopsant du dessus il suffit de placer CENTER au lieux de LEADING
SequentialGroup hGroup= layout.createSequentialGroup();
  ParallelGroup hg= layout.createParallelGroup(GroupLayout.Alignment.CENTER);
    hg.addComponent(jlabel);
    hg.addComponent(jbutton);
  hGroup.addGroup(hg);
  hg= layout.createParallelGroup(GroupLayout.Alignment.CENTER);
    hg.addComponent(jtextfieldnp);
    hg.addComponent(jbuttoncancel);
  hGroup.addGroup(hg);
layout.setHorizontalGroup(hGroup);
Resize boitte dialogue Step5a4.png
Step5

pack commande

Ici je laisse la boitte de dialogue s'adapter au comopsans qui sont dedans au lieux de la forcer
jdialoguenp.pack(); La comande pack permet defectuer le travaille mais elle doit etre placer en dernier sinon elel ne peux evaluer la taille des composants
if ("newProject".equals(e.getActionCommand())) {
	nomatch=false;
	//System.out.println("newProject catch");
	jdialoguenp = new JDialog(jframe,"New Project",true);
	//jdialoguenp.setSize(300,150);
	//jdialoguenp.setResizable(false);
			
	jdialoguenp.setLocationRelativeTo(jframe);
	//on charge le jpannel pour la boitte de dial
	jdialoguenp.add(getJpannelAffichage3());
	jdialoguenp.pack();
	jdialoguenp.setVisible(true); 
}}
Gap Step5a5.png
Step5

Gap Step5a5

J'ais reforcer la taille du jdialogue pour que vous voyez le travaille du gap sur l'axe y
Cette commande vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE); signifie:
je veux mettre un espace (relatif a la taille des objey,de preference de la taille du contenaire,pouvant s'etendre a l'infinie)
ParallelGroup vGroup = layout.createParallelGroup(GroupLayout.Alignment.LEADING);		
  	SequentialGroup vsg= layout.createSequentialGroup();						
		vsg.addComponent(jlabel,20,20,20);
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
		vsg.addComponent(jbutton,20,20,20);
	vGroup.addGroup(vsg);
	vsg= layout.createSequentialGroup();
		vsg.addComponent(jtextfieldnp,20,20,20);
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
		vsg.addComponent(jbuttoncancel,20,20,20);
	vGroup.addGroup(vsg);
layout.setVerticalGroup(vGroup);
Gap Step5a6.png
Step5

Gap Step5a6

Ici je force l'espace a entre les 2 groupe de composant à 30 maxi (pour le min je restte dynamic)
Et je repartie le reste a l'infi avant et aprés
Agrandisser la fenetre poru voir le travailel du layout et des gap
ParallelGroup vGroup = layout.createParallelGroup(GroupLayout.Alignment.LEADING);		
	SequentialGroup vsg= layout.createSequentialGroup();						
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);	
		vsg.addComponent(jlabel,20,20,20);
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, 30);
		vsg.addComponent(jbutton,20,20,20);
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
	vGroup.addGroup(vsg);
	vsg= layout.createSequentialGroup();
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
		vsg.addComponent(jtextfieldnp,20,20,20);
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, 30);
		vsg.addComponent(jbuttoncancel,20,20,20);
		vsg.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
	vGroup.addGroup(vsg);
layout.setVerticalGroup(vGroup);
Step5

Gestion JButton

if ("cancelnp".equals(e.getActionCommand())) {
	nomatch=false;
	jdialoguenp.dispose();
}
if ("oknp".equals(e.getActionCommand())) {
	nomatch=false;
	projectname=jtextfieldnp.getText();
	System.out.println("MyGui.actionPerformed --> "+projectname);
	//FileProcessing fp = new FileProcessing();
	//fp.createfile(projectname+".backup");
	listModel.addElement(projectname);
	jlabelRigtPro.setText(projectname);
	jdialoguenp.dispose();
}
On gére les 2 action rajouté par le JDialog
projectname=jtextfieldnp.getText(); ici on recup le text entré listModel.addElement(projectname); la on le rajoute au model du jlist et donc à sont apparence
jlabelRigtPro.setText(projectname); ici on change le titre de la partie droite du jtabed pane

Jlist Action

private JList getJListProject(){
	jlistProject= new JList ();
	jlistProject.setModel(listModel);		
	jlistProject.addListSelectionListener(this);
	jlistProject.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	return jlistProject;
}
Deux point inportant ici:
1- jlistProject.addListSelectionListener(this); pour dir que l'on va reagir a la selection de la liste
2- jlistProject.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); pour dir que l'on ne peux selection que une case du jlist a la fois
public void valueChanged(ListSelectionEvent e) {		
	//int index=jlistProject.getSelectedIndex();
	projectname=(String)jlistProject.getSelectedValue();
	jlabelRigtPro.setText(projectname);		
}
Implementation de la methode permetant de reagir a la selection dans le jlist
int index=jlistProject.getSelectedIndex() ceci permet de connaitre l'index du champ cliquer
projectname=(String)jlistProject.getSelectedValue(); ici je recupére l'etiquette (le nom du projet)
jlabelRigtPro.setText(projectname); je le report a droite

Step5b JFileChooser

Step 5b jlist chooser
Step5b
Les bouttons from et to lance ce code (a qu'elle que detaille)
JFileChooser fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fc.showOpenDialog(null);
//recuperation du repertoire choisi
System.out.println(fc.getSelectedFile());
jtextfieldFrom.setText(""+fc.getSelectedFile());
//save des modif
fichier.savefromto(projectname,e.getActionCommand(),fc);

Cette partie du code est appelé par l'action du bouton run
ScanDir scanDir = new ScanDir(pwd,projectname, jtextfieldFrom.getText(), jtextfieldTo.getText());
scanDir.runScan();
le but de cette class et de parcourir le from et to et de faire un raport

Step6 GroupLayout

code step6
Step 6.1
Step6.1
Je procede en plusieur etape celle si est la plus difficile
J'organize differement le code de layout pour pouvoir faire des boucles
Cela ma pris pas mal de temps la plus parts des exemples etant organizé de facons imbriqué
Danger ne jamais mettre 2 fois le meme objet

JRadioButton [] arrayjr;
//horizontal
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
	//les objet charger sur le pgh1 seront aligné sur les x 
	ParallelGroup pgh1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);	 
		pgh1.addComponent(jlab[0],1000, 1000, 1000);	 
		//sur le sgh2 il se suivron
		GroupLayout.SequentialGroup sgh2 = layout.createSequentialGroup();
			sgh2.addComponent(jlab[1],200, 200, 200);	  		
	  		arrayjr= (JRadioButton[]) arrayobj[1];
	  		sgh2.addComponent(arrayjr[0],100, 100, 100);	
	  	pgh1.addGroup(sgh2);
	hGroup.addGroup(pgh1);
layout.setHorizontalGroup(hGroup);
	 
//vertical
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();	
	ParallelGroup pg1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);	 
		pg1.addComponent(jlab[0],50, 50, 50);//a	
	vGroup.addGroup(pg1);
		pg1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
		pg1.addComponent(jlab[1],50, 50, 50);//a	
		arrayjr= (JRadioButton[]) arrayobj[1];
		pg1.addComponent(arrayjr[0],50, 50, 50);	  	  	  	  
	vGroup.addGroup(pg1);  
layout.setVerticalGroup(vGroup);
Step 6.2
Step6.2
Mise en place de la boucle pour afficher les JRadioButton contenue dans le tableau d'objet
JRadioButton [] arrayjr;
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
//hGroup.addComponent(arg0); place composant seul devant 
ParallelGroup pgh1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);	 
	pgh1.addComponent(jlab[0],1000, 1000, 1000);	 
	GroupLayout.SequentialGroup sgh2 = layout.createSequentialGroup();
		sgh2.addComponent(jlab[1],200, 200, 200);	
		arrayjr= (JRadioButton[]) arrayobj[1];
		for (int i=0;i<arrayjr.length;i++){
			sgh2.addComponent(arrayjr[i],100, 100, 100);
		}
	pgh1.addGroup(sgh2);
hGroup.addGroup(pgh1);
layout.setHorizontalGroup(hGroup);
	 
//vertical
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();	

ParallelGroup pg1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);	 
	pg1.addComponent(jlab[0],50, 50, 50);//a	
vGroup.addGroup(pg1);		  
pg1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);
	pg1.addComponent(jlab[1],50, 50, 50);//a	
	arrayjr= (JRadioButton[]) arrayobj[1];
	for (int i=0;i<arrayjr.length;i++){
 		pg1.addComponent(arrayjr[i],50, 50, 50);
	}
vGroup.addGroup(pg1);  
layout.setVerticalGroup(vGroup);
Step 6.3
Step6.3
Step 6.2: mise en place des boucles bouclé :)
JRadioButton [] arrayjr;
//horizontal
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();	 
ParallelGroup pgh1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);	   		
for (int j=0;j<jlab.length;j++){
	System.out.println("label name : "+jlab[j].getName()+ "  j:"+j);
	if (jlab[j].getName().startsWith("Title")){
		pgh1.addComponent(jlab[j],1000, 1000, 1000);	
	}else{  		
		GroupLayout.SequentialGroup sgh2 = layout.createSequentialGroup();
		sgh2.addComponent(jlab[j],200, 200, 200);	
	  	arrayjr= (JRadioButton[]) arrayobj[j];
	  	for (int i=0;i<arrayjr.length;i++){
	  		System.out.println(" \t i:"+i);
	  		sgh2.addComponent(arrayjr[i],100, 100, 100);
	  	}
	  	pgh1.addGroup(sgh2);
	}
}  		
hGroup.addGroup(pgh1);
layout.setHorizontalGroup(hGroup);
//vertical
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
for (int j=0;j<jlab.length;j++){	
	System.out.println("label name : "+jlab[j].getName()+ "  j:"+j);
	ParallelGroup pg1= layout.createParallelGroup(GroupLayout.Alignment.LEADING);	 					
	pg1.addComponent(jlab[j],50, 50, 50);
	if (!(jlab[j].getName().startsWith("Title"))){
		arrayjr= (JRadioButton[]) arrayobj[j];
		for (int i=0;i<arrayjr.length;i++){
			System.out.println(" \t i:"+i);
			pg1.addComponent(arrayjr[i],50, 50, 50);
		}
	}
	vGroup.addGroup(pg1);			
}
layout.setVerticalGroup(vGroup);

Step7 JProgress Bar

code step7
Step 7
Step7
Mise en place Du code de sauvegarde.
Dans un premier temps je voullais utiliser un thread separé mais impossible de faire marcher la jProgress bar.
En faite il existe un mecanisme de thread avec swing qui permet de gerer les events swing.

Mise en place du mecanisme de thread swing + jprogressbar:
- Implementer la class de travaille en backgroup
- Integrer le jprogressbar dans le gui
- Implement PropertyChangeListener (methode propertyChange de reaction, permet de reagir au travaille en background)

Architecture de la classe de background:
public class Backup extends SwingWorker
public Void doInBackground() {
   code a faire en tache de fond
   return null;
}


public class Backup extends SwingWorker

Ma class extend le SwingWorker pour travailler avec les swing en background
Cela implique d'implementer 1 methode minimum qui est la methode doInBackground()
Swing gerera donc ce programme en tache de font tous en faisant remonter les evenement au moteur swing
J'ais aussi implementer Done qui indique que le travaille est finit

public Void doInBackground() {
      logger.info("--> backup start");
		fpreport.writeInitC(pwd + "/tmp/backupReport");
		
		for (int i = 0; i < jlab.length; i++) {
			purcent = i * (100 / jlab.length);
			setProgress(purcent);		
			backupcontrol(i);		
			logger.debug("--> "+purcent+"%");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}		
	return null;
}

setProgress(purcent);
ce code est important il signal a swing "hello la progression de ma tache a augmenter de (mon param ici purcent)"

Le block Thread.sleep(1000); a pour seul but de ralentir mon pc sinon je ne verais pas la progression du jprogress

Integration gui

Ensuite j'ai rajouté le jprogresse bar au niveaux du MyGui
jProgressBar= new JProgressBar(0,100);
jProgressBar.setValue(0);
jProgressBar.setStringPainted(true);
0,100 pour indiquer une progression de 0 a 100
Je place la valeur de depart a zero
Je fais afficher le chiffre de progression
puis j'embarque normalement mon jprogresse bar dans un composant de plus haut niveaux

Implement PropertyChangeListene= propertyChange()

public void propertyChange(PropertyChangeEvent evt) {
		System.err.println("propertyChange");
		String val,name;
		val=""+evt.getNewValue();
		name=evt.getPropertyName();
		System.out.println("evt.getNewValue():"+val+ " evt.getPropertyName()"+name);
		
    if ("progress" == name) {
    	int purcent = (Integer) evt.getNewValue();
  		jProgressBar.setValue(purcent);
    }
	
    //back.isDone() apellé plusieur fois
		if ("DONE".equals(val)){
			logger.debug(" --> end backup");
			jdialoguenp = new JDialog(jframe, "Report", true);
			jdialoguenp.setSize(640, 480);
			jdialoguenp.setResizable(true);
			jdialoguenp.setLocationRelativeTo(jframe);
			jdialoguenp.add(getJScrollPaneBackupReport());
			jdialoguenp.setVisible(true);		
		}
	}
Voici la methode qui permet de reagir au setProgress(purcent); et aussi au event automatique comme background task finish
Evt contient les element qui vont nous permetre de savoir pourquoi la methode a etais appelé
val=""+evt.getNewValue(); une valuer
name=evt.getPropertyName(); une raisons

if ("progress" == name) { --> si parceque on a progressé (setProgress(purcent);) en rouge au dessus
on actualise la jProgressBar

if ("DONE".equals(val)){ (progress est sur STATUS)
Ici on indique le traitement de baground est fini --> j'ouvre la popup de staus de fain de process