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

EDT/SwingWorker Java Discussion :

Composant de taille variable


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Par défaut Composant de taille variable
    bonjour a tous,
    j essais de faire un composant dont la taille peut etre "extanded" ou "collapsed"
    je vous explique comment je m y prends :

    un JPanel conteneur contient deux nouveaux JPanel, un pour le titre et un conteneur.
    quand un clic sur le Jpanel du titre survient, le conteneur voit sa taille augmenter progressivement de 0 a sa taille maximale. le but etant de creer une petite animation.
    je procede avec un javax.swing.Timer et cela fonctionne.
    le probleme est que des que je mets des objets dans mon conteneur et que je bouge la souris, l animation s en trouve ralentie, voire tres ralentie.

    je pensais a threader le tout, mais en lisant a droite a gauche, j ai remarque qu'on ne pouvait pas faire n importe quoi avec l EDT

    je ne sais vraiment pas comment m y prendre..
    pouvez vous m orienter s il vous plait?

    cordialement

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je présume que, à chaque étape de ton animation, tu provoques le recalcul des positions de tous les panneaux emboités.

    Il faudrait que tu nous précises la façon dont tu vois les choses d'une part, la façon dont tu les codes d'autre part, particulièrement au niveau du comportement des sous panneaux.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Par défaut
    bonjour
    merci de l attention que vous portez a mon probleme,
    voici comment je vois les choses :



    chaque conteneur est une classe extend JPanel redefinie par mes soins.

    en fait seul le jpanel depliable voit ses coordonnees recalculees.
    (il y a plusieurs conteneurs de volet dans un conteneur general)

    quand un clic survient sur le JPanel du titre, en fonction de l etat du panneau depliable, on le deroule ou le fait disparaitre.

    n'hesitez pas a me dire si tout cela manque d explication.
    merci encore

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le Timer me semble un bon choix... On pourrait voir son code ?

    a++

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Par défaut
    alors voila les sources de ce que j ai fait

    sources volet

    sans rajouter trop de composant, ca se passe assez bien, mais en y ajoutant des boutons / imgs avec listeners, ca devient tres lent, et si la souris bouge la vitesse change / ralentie

    voici le code direct

    JVolet.class
    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
     
    import java.awt.BorderLayout;
    import java.util.Vector;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class JVolet extends JPanel {
     
    	private Vector<Volet> mesVolets;
    	private int rounded;
    	private int nbVolet;
     
    	public JVolet(int rounded) {
    		super();
    		this.rounded = rounded;
    		mesVolets = new Vector<Volet>();
    		this.nbVolet = 0;
    	}
     
    	public int addVolet(String title) {
    		Volet v = new Volet(nbVolet, this.rounded, title, this);
    		this.mesVolets.add(v);
    		add(v);
    		this.nbVolet++;
    		return (nbVolet - 1);
    	}
     
    	public void manageVolet(int id) {
    		for(Volet v : mesVolets) {
    			v.changeEtat();
    		}
    	}
    }
    Volet.class

    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
     
    import java.awt.BorderLayout;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
     
    import swing.JRoundedPanel;
    //import swing.volet.JVoletSW;
     
    public class Volet extends JPanel {
     
    	private int rounded;
    	private int id;
    	private JvTitle jvT;
    	private JvContentPane jvC;
    	private JVolet jv;
     
    	Volet(int id, int rounded, String title, JVolet jv) {
    		super();
    		this.rounded = rounded;
    		this.id = id;
    		this.jv = jv;
    		jvT = new JvTitle(this.rounded, title, id, jv);
    		jvC = new JvContentPane(rounded);
    		this.setLayout(new BorderLayout());
    		this.add(jvT, BorderLayout.NORTH);
    		this.add(jvC, BorderLayout.CENTER);
    	}
     
    	public int getId() {
    		return this.id;
    	}
     
    	public JvTitle getJvTitle() {
    		return this.jvT;
    	}
    	public JvContentPane getJvContentPane() {
    		return this.jvC;
    	}
     
    	public void changeEtat() {
    		this.jvC.changeEtat();
    	}
     
    }
    JvTitle.class
    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
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    import javax.swing.JLabel;
     
    import swing.JRoundedPanel;
     
    public class JvTitle extends JRoundedPanel implements MouseListener {
     
    	private int rounded;
    	private String title;
    	private JLabel lblTitle;
    	private JVolet jv;
    	private int id;
    	private Dimension maxDim;
     
    	JvTitle(int rounded, String title, int id, JVolet jv) {
    		super(rounded);
    		this.rounded = rounded;
    		this.title = title;
    		this.lblTitle = new JLabel(title);
    		this.id = id;
    		this.jv = jv;
    		this.maxDim = new Dimension(200, 30);
    		add(lblTitle);
    		this.setBackground(Color.gray);
    		this.addMouseListener(this);
    	}
     
    	public void setTitle(String title) {
    		this.title = title;
    		this.lblTitle.setText(title);
    	}
     
    	public String getTitle() {
    		return this.title;
    	}
     
    	public Dimension getPreferredSize() {
    		return maxDim;
    	}
     
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseExited(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mousePressed(MouseEvent e) {
    		// TODO Auto-generated method stub
    		jv.manageVolet(this.id);
    	}
     
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    }
    JvContentPane.class

    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
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
    import swing.JRoundedPanel;
     
    public class JvContentPane extends JRoundedPanel implements ActionListener {
     
    	private int rounded;
    	private Dimension maxDim;
    	private boolean etat;
    	private Timer t;
    	private int height;
     
    	JvContentPane(int rounded) {
    		super(rounded);
    		this.rounded = rounded;
    		this.maxDim = new Dimension(200, 50);
    		this.height = 0;
    		this.etat = false; // par defaut il est repli&#142;
    		setSize(getPreferredSize().width, this.height);
    		this.setBackground(Color.gray);
    		this.t = new Timer(10, this);
    		System.out.println(getHeight() + " " + this.etat);
    		JPanel p = new JPanel();
    		p.setMinimumSize(new Dimension(100, 100));
    		p.setPreferredSize(new Dimension(100, 100));
    		p.setMaximumSize(new Dimension(100, 100));
    		p.setBackground(Color.red);
    		add(p);
    	}
     
    	/*public void setMaxSize(Dimension d) {
    		this.maxDim = d;
    	}
    	public void setMaxSize(int width, int height) {
    		this.maxDim = new Dimension(width, height);
    	}*/
     
    	public Dimension getPreferredSize() {
    		return new Dimension(maxDim.width, height);
    	}
     
    	public void changeEtat() {
    		if(! this.t.isRunning()) {
    			this.t.start();
    			this.etat = ! this.etat;
    		}
    	}
     
    	private void setHeight(int height) {
    		//this.setSize(this.getWidth(), height);
    		this.height = height;
    		this.setSize(getWidth(), height);
    	}
     
    	public void paintComponent(Graphics g) {
    		g.setColor(getBackground());
    	    g.fillRoundRect(0, 0, getWidth(), getHeight(), rounded, rounded);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		Object o = e.getSource();
     
    		if(o == this.t) {
    			//System.out.println(getHeight() + " " + this.etat);
    			if(this.etat) {
    				setVisible(true);
    				if(getHeight() < super.getPreferredSize().height) {
    					this.setHeight(getHeight() + 1);
    				}
    				else {
    					this.t.stop();
    				}
    			}
    			else {
    				if(getHeight() > 0) {
    					this.setHeight(getHeight() - 1);
    				}
    				else {
    					this.t.stop();
    				}
    			}
    			revalidate();
    			repaint();
    		}
    	}
    }
    et voila, pour faire tourner ca voir dans le zip, ou j ai aussi mis mon JroundedPanel

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je pense que c'est le revalidate de l'actionPerformed du JvContentPane qui créé le blême. Supprime le pour voir, et tu vas retrouver la vitesse d'exécution (mais tu ne verras plus rien).

    Le revalidate provoque le recalcul de la position de tous les sous composants, qui essaient tous de s'adapter à la nouvelle taille, et ce à chaque petite modif de taille.

    Pour résoudre ça il faudrait savoir quel comportement tu souhaites avoir dans les sous-composants : se déplient-ils aussi, ont-il dès le départ la taille finale, respectent-ils la taille minimale ou je ne sais quoi d'autre ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/09/2006, 10h53
  2. [Beamer] Table des matières de taille variable
    Par jacklafrip dans le forum Beamer
    Réponses: 1
    Dernier message: 25/08/2006, 11h44
  3. objet de taille variable en attribut static
    Par BigNic dans le forum C++
    Réponses: 8
    Dernier message: 06/07/2006, 21h41
  4. [TP] Tableau de taille variable
    Par Ripley dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 30/01/2006, 15h36
  5. Comment obtenir un tableau à taille variable ?
    Par marsupilami34 dans le forum Langage
    Réponses: 6
    Dernier message: 27/06/2005, 15h03

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