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 :

Remettre les Components


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 42
    Par défaut Remettre les Components
    Bonjour

    J'ai un panel contenant plusieurs Components. Ces Components n'ont pas à changer, mais les panels qui les contiennent peuvent être changés. Le soucis est que lorsque que je remet dans mon panel ces nouveaux sous-panel, les Components ne s'affichent plus ... Exemple simplifié du soucis :
    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
    import java.awt.AWTEvent;
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Toolkit;
    import java.awt.event.AWTEventListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSplitPane;
    import javax.swing.plaf.basic.BasicSplitPaneDivider;
     
    public class Test extends JPanel implements MouseListener
    {
    	private ArrayList<Component> comps;
     
    	public Test ()
    	{
    		super(new BorderLayout());
    		comps = new ArrayList<Component>();
    		comps.add(new JLabel("0"));
    		comps.add(new JLabel("1"));
    		comps.add(new JLabel("2"));
     
    		Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
    		{
    			@Override
    			public void eventDispatched (AWTEvent event)
    			{
    				Object source = event.getSource();
    				if (source instanceof BasicSplitPaneDivider)
    					return;
    				else if (source instanceof Component)
    				{
    					Component c = (Component) source;
    					if (isParentOf(c))
    						Test.this.processEvent(event);
    				}
    			}
    		}, MouseEvent.MOUSE_EVENT_MASK);
     
    		redoContent();
    		addMouseListener(this);
    	}
     
    	protected boolean isParentOf (Component c)
    	{
    		while (c.getParent() != null)
    		{
    			if (c.getParent() == this)
    				return true;
    			c = c.getParent();
    		}
    		return false;
    	}
     
    	private void redoContent ()
    	{
    		JSplitPane content = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, comps.get(1), comps.get(2));
    		content = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, comps.get(0), content);
    		add(content, BorderLayout.CENTER);
    	}
     
    	@Override
    	public void mouseClicked (MouseEvent arg0)
    	{
    		redoContent();
    		System.out.println("Done");
    	}
     
    	@Override
    	public void mouseEntered (MouseEvent arg0)
    	{}
     
    	@Override
    	public void mouseExited (MouseEvent arg0)
    	{}
     
    	@Override
    	public void mousePressed (MouseEvent arg0)
    	{}
     
    	@Override
    	public void mouseReleased (MouseEvent arg0)
    	{}
     
    	public static void main (String[] args)
    	{
    		JFrame f = new JFrame();
    		f.setSize(640, 480);
    		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		f.setContentPane(new Test());
    		f.setVisible(true);
    	}
    }
    Pour l'utilisation : cliquez simplement sur les splitpane pour que la fenêtre "remette" les components et constatez qu'ils n'apparaissent plus ... J'avais essayer d'enregistrer le SplitPane principal pour le supprimer avant de le remettre mais ça ne change rien :s

    Une idée pour résoudre ceci ?

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

    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
    private void redoContent ()
    	{
    		
    		removeAll();
    		
    		JSplitPane content = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, comps.get(1), comps.get(2));
    		content = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, comps.get(0), content);
    		add(content, BorderLayout.CENTER);
    	}
     
    	@Override
    	public void mouseClicked (MouseEvent arg0)
    	{
    		redoContent();
    		revalidate();
    		System.out.println("Done");
    	}
    Le removeAll() empêche les JSplitPane de s'accumuler dans leur container : comme ils doivent conserver des références sur les composants 1, 2, 3 que tu mets de dedans, cela peut expliquer le fait qu'ils ne s'affichent plus (je ne connais pas le détail interne du fonctionnement, mais c'est probablement l'explication).

    Le revalidate() sert à prévenir que les barres de split doivent être remise à zéro, parce qu'on a changé les JSplitSpane.

    Remarque que tu peux avoir exactement le même comportement par :
    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
    private JSplitPane content2;
    	private JSplitPane content1;
    	private void redoContent ()
    	{
     
    		content2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, comps.get(1), comps.get(2));
    		content1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, comps.get(0), content2);
    		add(content1, BorderLayout.CENTER);
    	}
     
    	@Override
    	public void mouseClicked (MouseEvent arg0)
    	{ 
    		content1.resetToPreferredSizes();
    		content2.resetToPreferredSizes();
     
    		System.out.println("Done");
    	}
    et ça évite de recréer des composants à chaque fois
    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 averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 42
    Par défaut
    Merci

    Les 2 SplitPane étaient là à titre d'exemple, le nombre est variable, et tout ne se met pas forcement dans être ordre, etc ...

    Maintenant mon Drag&Drop de panels fonctionne sans problèmes, merci

    (Se dire que j'avais juste à remplacer "remove(panel)" par "removeAll()" ... xD)

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

Discussions similaires

  1. [chmod] Remettre les droits par défaut
    Par Haze. dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 06/09/2017, 20h33
  2. Remettre les balises HTML après un strip_tags
    Par ZeKlubb dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2007, 09h33
  3. Réponses: 3
    Dernier message: 29/03/2007, 16h03
  4. [WD 10] Comment remettre les ID auto à 0 ?
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 3
    Dernier message: 04/12/2006, 05h19
  5. remettre les balises apres un strip tags
    Par skin_1_2_3 dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 15h31

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