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

Agents de placement/Fenêtres Java Discussion :

[OverlayLayout] deuxième panel qui ne s'affiche plus


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut [OverlayLayout] deuxième panel qui ne s'affiche plus
    Bonjour,

    j'ai une IHM en borderLayout dont le panneau central est composé de plusieurs panneau. Lors d'un appui sur un bouton, je veux faire apparaitre un panneau transparent avec un message d'attente sur ce panneau central.
    Pour y arrivé, j'ai utilisé un OverlayLayout qui contient en premier un panneau contenant tout ce qui doit être visible en temps normal, et en deuxième un panneau transparent avec le message qui ne doit être visible que dans certains cas.
    Le panneau en OverlayLayout est créé lors de la création de la fenetre de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    panneauCentreSuperposable = new JPanel();
    panneauCentreSuperposable.setLayout(new OverlayLayout(panneauCentreSuperposable));
    panneauCentreSuperposable.add(panneauPrincipal);
    au départ, je créais et ajoutais le panneau transparent dans le constructeur d'un SwingWorker, je le rendais visible au début du doInBackground et le cachais à la fin du done() :
    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
    	public SwingWorkerAffichage(FenetreLAM fenetre, Mammo mammo)
    	{
    		this.fenetre = fenetre;
    		this.control = fenetre.getControl();
    		this.mammo = mammo;
    		this.panneauSuperposable = fenetre.getPanneauCentre();
     
    		JLabel texteAttente = new JLabel("Chargement en cours...", JLabel.CENTER);
    		texteAttente.setForeground(Color.white);
    		texteAttente.setFont(new Font(texteAttente.getFont().getName(), Font.BOLD, 22));
     
    		panneauAttente = new JPanel(new GridLayout(3,1));
    		panneauAttente.add(new JLabel());
    		panneauAttente.add(texteAttente);
    		panneauAttente.add(new JLabel());
    		panneauAttente.setOpaque(true);
    		panneauAttente.setBackground(new Color(0,0,0,100));
    		panneauSuperposable.add(panneauAttente);
    		panneauAttente.setVisible(false);
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.swing.SwingWorker#doInBackground()
    	 */
    	@Override
    	protected Image[] doInBackground() throws Exception
    	{
    		panneauAttente.setVisible(true);
    		Image[] images = control.afficherMammo(mammo.getNom());
     
    		return images;
    	}
     
    	@Override
    	protected void done()
    	{
    		try
    		{
    			//[...]
    			panneauAttente.setVisible(false);
    		} 
    		catch (Exception ignore)
    		{
    			ignore.printStackTrace();
    		}
    	}
    ça marchait plutôt bien, mais au final, j'ai un autre traitement qui lui n'est pas dans un SwingWorker mais pour lequel j'aimerais utiliser le même système.
    Donc j'ai sortie la création du panneau transparent du swingWorker pour le mettre lors de la construction de la fenêtre :
    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
     
    		//Creation d'un panneau qui contiendra le panneauPrincipal et surlequel on pourra
    		//ajouter un autre panneau transparent pour faire patienter lors du chargement de l'image
    		//(possible grace a l'overlayLayout)
    		panneauCentreSuperposable = new JPanel();
    		panneauCentreSuperposable.setLayout(new OverlayLayout(panneauCentreSuperposable));
    		panneauCentreSuperposable.add(panneauPrincipal);
     
    		texteAttente = new JLabel("Analyse en cours...", JLabel.CENTER);
    		texteAttente.setForeground(Color.white);
    		texteAttente.setFont(new Font(texteAttente.getFont().getName(), Font.BOLD, 22));
     
    		panneauAttente = new JPanel(new GridLayout(3,1));
    		panneauAttente.add(new JLabel());
    		panneauAttente.add(texteAttente);
    		panneauAttente.add(new JLabel());
    		panneauAttente.setOpaque(true);
    		panneauAttente.setBackground(new Color(0,0,0,100));
    		panneauCentreSuperposable.add(panneauAttente);
    		panneauAttente.setVisible(true);
    J'ai mis le setVisible() directement à true pour tester, mais le panneauAttente n'apparait pas. Je ne comprends pas pourquoi ça marchait dans le swingWorker et que ça ne marche plus en dehors...

    y'a-t-il une particularité des overlayLayout qui m'échappe?

  2. #2
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Il faut mettre le panneauAttente à l'avant plan:
    panneauCentreSuperposable.setComponentZOrder(panneauAttente, 0);

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    merci pour ta réponse.

    En effet, mettre un setComponentZOrder permet de faire apparaitre le panneau dans le test directement après la construction du panneau

    ça marche aussi quand on fait ensuite un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JPanel panneauAttente = fenetre.getPanneauAttente();
    panneauAttente.setVisible(true);
    dans un swingworker.

    Par contre, ça ne marche pas dans le actionPerformed d'un bouton
    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
     
    public void actionPerformed(ActionEvent e)
    {
    	//Si la selection est vide : message d'erreur
    	if(fenetre.getListeMammos().isSelectionEmpty())
    	{
    		JOptionPane.showMessageDialog(fenetre, 
    				FenetreLAM.messages.getString("messageNoMammoSelect"), 
    				FenetreLAM.messages.getString("titreMessageLancementAnalyse"), 
    				JOptionPane.WARNING_MESSAGE);
    	}
    	else 
    	{
    		//[...]
     
    		if(lancerAnalyse)
    		{
    			//[...]
    			JPanel panneauAttente = fenetre.getPanneauAttente();
     
    			for(Object objet : mammosSelectionnees)
    			{
    				panneauAttente.setVisible(true);
    				Mammo  mammo = (Mammo) objet;
     
    				if("EnAttenteAnalyse".equals(mammo.getEtat()))
    				{
    					String nomMammo = mammo.getNom();
    					control.lancerAnalyser(nomMammo, prefs.get("format", "bmp"));
    					mammo.setEtat("EnAttenteValidation");
    					panneauAttente.setVisible(false);
     
    					//[...]
    				}
    			}
    		}
    	}
    }
    J'ai aussi essayé en remettant le setComponentZOrder dans le actionPerformed, mais rien y fait.
    Y'a-t-il une autre subtilité qui m'échappe ?

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Plutôt qu'un OverlayLayout tu devrais passer par le glasspane qui est prévu pour être au dessus de tous les composants et se contrôle via un simple setVisible.

    http://java.sun.com/docs/books/tutor.../rootpane.html

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    En fait, j'utilise aussi le glasspane pour une autre fonctionalité, mais je n'arrive pas à le faire marcher ici...
    Je m'explique, mon appli peut lancer des analyses de 2 façons : manuelle ou automatique. Pour l'analyse auto, l'utilisateur clique sur le bouton, le glasspane apparait, tous les objets sont analysés puis le glasspane disparait.
    Je fais ça avec un swingworker de la manière suivante :

    code du glasspane:
    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
    /**
     * Projet : LAM
     * Paquetage : fr.statlife.LAM.IHM
     * Fichier : FixedGlassPane.java
     *
     * Classe permettant d'afficher le GlassPane avec une ProgressBar pour bloquer
     * l'application pendant l'analyse.
     * Classe recuperee sur
     * http://www.java2s.com/Code/Java/Swing-JFC/Showhowaglasspanecanbeusedtoblockmouseandkeyevents.htm
     *
     * @author Mathilde Pellerin
     * @date 18 mai 2010
     */
     
     
    /*
    Java Swing, 2nd Edition
    By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
    ISBN: 0-596-00408-7
    Publisher: O'Reilly 
    */
     
    /*
    This directory contains a fixed GlassPane example.  
     
    This fixes two bugs:
      1) Key events were not supressed in the original example, they are now
      2) On 1.2 and 1.3 systems, firHtmlLabelst mouse click after removing glass pane
         would not be sent to the component under the mouse.  This was a bug
         in the way JRootPane handled the glass pane component that has been
         fixed in the 1.4 release.  FixedGlassPane.java (see below) provides
         a workaround for 1.2 and 1.3, but is still safe to use with 1.4.
     
    The updated files are:
     
    SwingGlassExample.java       Updated to use (and control) the new glass pane
    FixedGlassPane.java    Extension of JPanel that allows for redispatching
                                          erroneous events to their rightful owners
    */
    package fr.statlife.LAM.IHM;
     
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Point;
    import java.awt.Toolkit;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
     
    import javax.swing.JMenuBar;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
     
    //Based in part on code from the Java Tutorial for glass panes (java.sun.com).
    //This version handles both mouse events and focus events.  The focus is
    //held on the panel so that key events are also effectively ignored.  (But
    //a KeyListener could still be attached by the program activating this pane.)
    //
     
     
    @SuppressWarnings("serial")
    class FixedGlassPane extends JPanel implements MouseListener,
    	MouseMotionListener, FocusListener 
    {
    	// helpers for redispatch logic
    	Toolkit toolkit;
     
    	private JMenuBar menuBar;
     
    	private Container contentPane;
     
    	boolean inDrag = false;
     
    	// trigger for redispatching (allows external control)
    	boolean needToRedispatch = false;
     
    	public FixedGlassPane(JMenuBar mb, Container cp) {
    		toolkit = Toolkit.getDefaultToolkit();
    		menuBar = mb;
    		contentPane = cp;
    		addMouseListener(this);
    		addMouseMotionListener(this);
    		addFocusListener(this);
    	}
     
    	public void setVisible(boolean v) {
    		// Make sure we grab the focus so that key events don't go astray.
    		if (v)
    			requestFocus();
    		super.setVisible(v);
    	}
     
    	// Once we have focus, keep it if we're visible
    	public void focusLost(FocusEvent fe) {
    		if (isVisible())
    			requestFocus();
    	}
     
    	public void focusGained(FocusEvent fe) {
    	}
     
    	// We only need to redispatch if we're not visible, but having full control
    	// over this might prove handy.
    	public void setNeedToRedispatch(boolean need) {
    		needToRedispatch = need;
    	}
     
    	/*
    	 * (Based on code from the Java Tutorial) We must forward at least the mouse
    	 * drags that started with mouse presses over the check box. Otherwise, when
    	 * the user presses the check box then drags off, the check box isn't
    	 * disarmed -- it keeps its dark gray background or whatever its L&F uses to
    	 * indicate that the button is currently being pressed.
    	 */
    	public void mouseDragged(MouseEvent e) {
    		if (needToRedispatch)
    			redispatchMouseEvent(e);
    	}
     
    	public void mouseMoved(MouseEvent e) {
    		if (needToRedispatch)
    			redispatchMouseEvent(e);
    	}
     
    	public void mouseClicked(MouseEvent e) {
    		if (needToRedispatch)
    			redispatchMouseEvent(e);
    	}
     
    	public void mouseEntered(MouseEvent e) {
    		if (needToRedispatch)
    			redispatchMouseEvent(e);
    	}
     
    	public void mouseExited(MouseEvent e) {
    		if (needToRedispatch)
    			redispatchMouseEvent(e);
    	}
     
    	public void mousePressed(MouseEvent e) {
    		if (needToRedispatch)
    			redispatchMouseEvent(e);
    	}
     
    	public void mouseReleased(MouseEvent e) {
    		if (needToRedispatch) {
    			redispatchMouseEvent(e);
    			inDrag = false;
    		}
    	}
     
    	private void redispatchMouseEvent(MouseEvent e) {
    		boolean inButton = false;
    		boolean inMenuBar = false;
    		Point glassPanePoint = e.getPoint();
    		Component component = null;
    		Container container = contentPane;
    		Point containerPoint = SwingUtilities.convertPoint(this,
    				glassPanePoint, contentPane);
    		int eventID = e.getID();
     
    		if (containerPoint.y < 0) {
    			inMenuBar = true;
    			container = menuBar;
    			containerPoint = SwingUtilities.convertPoint(this, glassPanePoint,
    					menuBar);
    			testForDrag(eventID);
    		}
     
    		//XXX: If the event is from a component in a popped-up menu,
    		//XXX: then the container should probably be the menu's
    		//XXX: JPopupMenu, and containerPoint should be adjusted
    		//XXX: accordingly.
    		component = SwingUtilities.getDeepestComponentAt(container,
    				containerPoint.x, containerPoint.y);
     
    		if (component == null) {
    			return;
    		} else {
    			inButton = true;
    			testForDrag(eventID);
    		}
     
    		if (inMenuBar || inButton || inDrag) {
    			Point componentPoint = SwingUtilities.convertPoint(this,
    					glassPanePoint, component);
    			component.dispatchEvent(new MouseEvent(component, eventID, e
    					.getWhen(), e.getModifiers(), componentPoint.x,
    					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
    		}
    	}
     
    	private void testForDrag(int eventID) {
    		if (eventID == MouseEvent.MOUSE_PRESSED) {
    			inDrag = true;
    		}
    	}
    }
    code du swingWorker :
    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
    /**
     * Projet : LAM
     * Paquetage : fr.statlife.LAM.IHM
     * Fichier : SwingWorkerAnalyse.java
     *
     * @author Mathilde Pellerin
     * @date 18 mai 2010
     */
    package fr.statlife.LAM.IHM;
     
    import java.util.concurrent.ExecutionException;
    import java.util.prefs.Preferences;
     
    import javax.swing.SwingWorker;
     
    import fr.statlife.LAM.Controleur;
     
    /**
     * 
     * @author Mathilde Pellerin
     */
    public class SwingWorkerAnalyse extends SwingWorker<Integer, String>
    {
    	private static final FacadeIHM ihm = FacadeIHM.getInstance();
    	private Controleur control;
    	private FenetreLAM fenetre;
    	private Preferences prefs;
    	private Object[] mammosSelectionnees;
    	private Mammo premiereMammo;
     
    	public SwingWorkerAnalyse(FenetreLAM fenetre,  
    			Object[] mammosSelectionnees)
    	{
    		this.control = fenetre.getControl();
    		this.fenetre = fenetre;
    		this.mammosSelectionnees = mammosSelectionnees;
    		this.prefs = fenetre.getPrefs();
     
    		//Ajout d'un ecouteur de barre de progression
    		this.addPropertyChangeListener(fenetre.getListenerProgressionAnalyse());
    	}
     
    	public void setProgressPublic(int progress)
    	{
    		this.setProgress(progress);
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.swing.SwingWorker#doInBackground()
    	 */
    	@Override
    	protected Integer doInBackground() throws Exception
    	{
    		Integer nbMammosTraitees = 0;
     
    		fenetre.getGlass().setNeedToRedispatch(false);
    		fenetre.getGlass().setVisible(true);
     
    		int nbAAnalyser = mammosSelectionnees.length;
    		double etape = 100 / nbAAnalyser;
    		double progressStart = 0;
     
    		for(Object objet : mammosSelectionnees)
    		{
    			Mammo mammo = (Mammo)objet;
    			String nomMammo = mammo.getNom();
    			control.lancerAnalyser(nomMammo, prefs.get("format", "bmp"));
     
    			progressStart += etape;
    			setProgress((int)progressStart);
     
    			nbMammosTraitees ++;
    			//Sauvegarde de la premiere mammo analysee
    			if(nbMammosTraitees == 1)
    				premiereMammo = mammo;
    		}
     
    		fenetre.getGlass().setVisible(false);
     
    		return nbMammosTraitees;
    	}
     
    	protected void done()
    	{
    		try
    		{
    			//Le traitement est termine
    			setProgress(100);
    			int nbMammoTraitees = get(); 
     
    			//changement de l'etat des mammos dans la liste
    			for(Object obj : mammosSelectionnees)
    			{
    				Mammo mammo = (Mammo) obj;
    				if(mammo.getEtat().equals("EnAttenteAnalyse"))
    					mammo.setEtat("EnAttenteValidation");
    			}
    			premiereMammo.afficherMammo();
     
    			//Affichage du nombre de mammos analysees dans la console 
    			ihm.afficherMessageConsole(nbMammoTraitees
    					+ " "+ FenetreLAM.messages.getString("messageNbAnalysees")+"\n");
     
    			setProgress(0);
    		} 
    		catch (InterruptedException e) 
    		{
    			e.printStackTrace();
    		} 
    		catch (ExecutionException e) 
    		{
    			System.err.println("SwingWorkerAnalyse : exception survenue dans le doInBackground : ");
    			e.printStackTrace();
    		}
    	}
    }
    ça marche très bien.

    Maintenant, pour l'analyse manuelle, l'utilisateur clique sur le bouton, un objet est analysé, une boite de dialogue demande à l'utilisateur s'il valide l'analyse ou non, une fois que l'utilisateur à validé (ou invalidé), l'analyse de l'objet suivant commence et ainsi de suite. Cette fois, je n'utilise pas de SwingWorker pour que les analyses se fassent bien les unes à la suite des autres et pas toutes en même temps. Et c'est avec cette manière de faire là que je n'arrive pas à afficher de panneau d'attente.
    Dans le code suivant, l'essaie avec l'overlayLayout est commenté et l'essaie avec le glasspane (qui ne marche pas non plus) est décommenté :
    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
    public void actionPerformed(ActionEvent e)
    {
    	//Si la selection est vide : message d'erreur
    	if(fenetre.getListeMammos().isSelectionEmpty())
    	{
    		JOptionPane.showMessageDialog(fenetre, 
    				FenetreLAM.messages.getString("messageNoMammoSelect"), 
    				FenetreLAM.messages.getString("titreMessageLancementAnalyse"), 
    				JOptionPane.WARNING_MESSAGE);
    	}
    	else 
    	{
    		//Recuperation du nom des mammos selectionnees
    		Object[] mammosSelectionnees =  fenetre.getListeMammos().getSelectedValues();
     
    		boolean lancerAnalyse = true;
    		//Si une seule mammo est selectionnee, on verifie qu'elle n'a pas deja ete
    		//analysee avant de lancer l'analyse
    		if(mammosSelectionnees.length == 1)
    		{
    			Mammo mammo = (Mammo)mammosSelectionnees[0];
    			if(!"EnAttenteAnalyse".equals(mammo.getEtat()))
    			{
    				JOptionPane.showMessageDialog(fenetre, 
    						FenetreLAM.messages.getString("messageMammoDejaAnalysee"), 
    						FenetreLAM.messages.getString("titreMessageLancementAnalyse"), 
    						JOptionPane.INFORMATION_MESSAGE);	
    				lancerAnalyse = false;
    			}
    		}
     
    		if(lancerAnalyse)
    		{
    			SwingWorkerAnalyse swingWorkerAnalyse = null;
     
    			//Instanciation du swingWorkerAnalyse en fonction du mode d'execution choisi
    			if(typeAnalyse.contains("automatique"))
    			{
    				swingWorkerAnalyse = new SwingWorkerAnalyse(fenetre, mammosSelectionnees);
    				swingWorkerAnalyse.execute();
    			}
    			else if(typeAnalyse.contains("manuelle"))
    			{
    //					JPanel panneauAttente = fenetre.getPanneauAttente();
    //					JPanel panneauCentre = fenetre.getPanneauSuperposable();
    //					panneauAttente.setVisible(true);
     
    				for(Object objet : mammosSelectionnees)
    				{
    //					panneauAttente.setVisible(true);
    					fenetre.getGlass().setVisible(true);
    					Mammo  mammo = (Mammo) objet;
     
    					if("EnAttenteAnalyse".equals(mammo.getEtat()))
    					{
    						String nomMammo = mammo.getNom();
    						control.lancerAnalyser(nomMammo, prefs.get("format", "bmp"));
    						mammo.setEtat("EnAttenteValidation");
    //							panneauAttente.setVisible(false);
    						fenetre.getGlass().setVisible(false);
     
    						if(mammo.afficherMammo())
    						{
    							int confirm = JOptionPane.showConfirmDialog(fenetre, 
    									FenetreLAM.messages.getString("messageQuestionValidation"), 
    									FenetreLAM.messages.getString("titreMessageValidationMammo"), 
    									JOptionPane.YES_NO_OPTION);
     
    							//on selectionne la mammo courante dans la liste 
    							//puis on simule un clique sur le bouton valider (ou invalider)
    							fenetre.getListeMammos().setSelectedValue(mammo, false);
    							if(confirm == JOptionPane.YES_OPTION)
    								fenetre.getBoutonValidation().doClick();
    							else
    								fenetre.getBoutonInvalidation().doClick();
    						}
    					}
    				}
    			}
    		}
    	}
    }
    bref, tout ça pour dire que j'ai aussi essayé avec le glasspane mais sans succès
    Je m'y prends vraiment mal ou y'a un truc de vraiment bizarre ?

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    J'ai du mal déjà à comprendre pourquoi tu ne pourrais pas enchainer toutes tes traitements dans un unique SwingWorker, et juste afficher un indicateur d'attente sur le glasspane?

    Genre https://swingfx.dev.java.net/ pour l'attente et un SwingWorker que tu développe de telle façon qu'il prenne en paramètre une liste d'objets correspondant chacun à une tâche.

  7. #7
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    c'était mon idée de départ. Le problème, c'est pour les analyse dites "manuelles", l'utilisateur doit valider chaque étape de l'analyse via une boite de dialogue pour que l'étape suivante démarre. Ce qui revient à appeler des éléments de Swing hors de l'EDT, non?

    [Edit] je suis allée voir le lien que tu m'as donné, le InfiniteProgressPanel peut en effet être très intéressant pour le traitement manuel. Je vais fouiller un peu plus et faire quelques tests. Merci pour le lien

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bah dans ce cas il te suffit d'avoir un SwingWorker pour chaque étape.
    Je ne vois pas où est le problème conceptuel de fait.

  9. #9
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    C'est aussi ce que j'avais fait au départ (peut être mal cela dit...)
    Mais en faisant une boucle for qui appelle un nouveau swingworker à chaque fois, tous les swingworker se lançaient en parallèle et j'arrivais pas à interposer ma phase de validation. J'avais posté ici à ce propos.

    Cela dit, je suis pas sur de m'être bien exprimée : quand je parle d'étapes, c'est à chaque fois le même traitement qui est lancé mais sur un objet différent. Genre une boucle for avec la phase de validation nécessaire avant de passer à l'objet suivant.


    j'étais en train d'essayer de tout remettre dans le SwingWorker, mais un problème se pose :
    pour que l'utilisateur puisse valider une étape, le logiciel affiche le résultat avant de faire apparaitre la boite de dialogue. Problème : l'affichage du résultat appelle un autre SwingWorker et du coup ça bloque complètement l'appli.
    Bref, je sens que j'ai pas fini de m'arracher les cheveux avant de faire un truc propre et qui marche bien

  10. #10
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    au final j'ai réussi à obtenir le résultat que je voulais
    Pour ce faire, j'ai tout remis dans un seul SwingWorker comme sinok me l'avais conseillé.
    Je me suis aussi inspirée de ce post dans le sous-forum EDT/SwingWorker

    Et au final, je n'utilise pas d'OverlayLayout mais un seul et même glasspane du coup.

    Merci pour votre aide

    zab'

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

Discussions similaires

  1. [ZF 1.10] Suggestbox qui ne s'affichent plus
    Par cyrux dans le forum Zend Framework
    Réponses: 1
    Dernier message: 18/08/2010, 12h02
  2. nouvelles actions qui ne s'affichent plus
    Par dida.ratsimba dans le forum W4 Express
    Réponses: 0
    Dernier message: 21/04/2009, 21h57
  3. [JpGraph] Graphique qui ne s'affiche plus après avoir modifié l'exemple
    Par kanabzh29 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 18/08/2008, 12h00
  4. Réponses: 5
    Dernier message: 13/11/2007, 12h17
  5. Réponses: 9
    Dernier message: 29/01/2007, 09h40

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