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

Composants Java Discussion :

Comment ajouter des composants par un click ?


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut Comment ajouter des composants par un click ?
    Bonjour,

    Voila, mon appli a besoin d'une zone (classe Centre qui hérite de JPanel) ou l'on peut ajouter des autres JPanel (ici une classe Piste qui hérite donc de JPanel aussi) en cliquant sur un bouton, mais quand je clique, rien de ne passe:

    voila le code de la classe, j'ai du faire une bétise quelquepart

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Centre extends JPanel //implements Scrollable
    {	
    	public Centre()
    	{
    		setBackground(java.awt.Color.LIGHT_GRAY);
    		setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
    	}
     
    	public void nouvellePiste(File fichier)
    	{
    		Log.ecrire("Création d'une nouvelle piste avec fichier "+fichier);
    		add(new Piste(fichier));
    	}
    }
    J'ai ici utilisé un BoxLayout pour que les composants ajoutés soient les uns au dessus des autres.

    Si quelqu'un entrevoit une solution...

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Déjà, as-tu le message, pourrais-tu nous montre le code qui fait appel à nouvellePiste?

  3. #3
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    oui oui, j'ai bien le message du log, je l'ai mis la exprès pour ça, je fais ça comme ça:

    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
    public void actionPerformed(ActionEvent e) 
    	{
    		if(e.getSource()==chargerAudio)
    		{
    			Log.ecrire("Demande de chargement de fichier audio");
    			JFileChooser fc = new JFileChooser();
    			int returnVal = fc.showOpenDialog(this);
    			if (returnVal == JFileChooser.APPROVE_OPTION) 
    			{
                    File file = fc.getSelectedFile();
                    scrollZone.nouvellePiste(file);
    			}
    			else return;
    		}
    	}
    Ou chargerAudio est le nom du bouton qui génère l'évènement

    Mais j'ai bien les deux messages dans le log, ce qui porte à croire que la fonction nouvellePiste est bien appelée.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    scrollzone est-il bien présent à l'écran (ajoute lui un bord rouge ou autre pour etre sur), même chose pour l'objet Piste (couleur différente). Montre nous aussi le code de Piste. Probablement que Piste a une taille de 0

  5. #5
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    J'ai testé la meme chose sans la scrollZone, ça change rien, donc ça ne vient pas de la (du moins pas pour l'instant lol).

    Je vais mettres des bordures voir ce que ça donne

  6. #6
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Bon ba ça vient bien du fait que la piste ne se rajoute pas au Centre, car quand je met des bordures, on voit celle du centre, mais j'ai beau cliquer mille fois, aucune bordure de piste.

    Et le pistes ne sont pas vide, puisque quand je met juste une piste dans un JFrame, ça marche nikel....

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    est-tu sur d'ajoute la piste dans la bonne instance de centre? Change la couleur de bordure de centre quand t'ajoute la piste ...?

  8. #8
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Ah ça y est j'ai trouvé, c'est trés bete, je m'explique.
    Avec le changement de couleur de la bordure du Centre (c'était la bonne instance, et pour cause, y en a qu'une^^), ça marche comme par magie, et dés que je l'enlève le changement, ça remarche pu, sauf si je redimensionne la fenêtre

    donc je suppose que ça doit venir du fait que le centre n'est pas redéssiné à l'ajout d'une piste, ce qui me mène à une autre question, comment qu'on peut faire ça?^^ si je fais un centre.update(centre.getGraphics()); ???

    //edit
    Bon ba réponse à moi même, nan ça marche pas :p

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    normalement, c'est repaint(), mais normalement, un add() provoque le redessinage. Probablement que ton Piste n'est pas très orthodoxe, on pourrait le voir?

  10. #10
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Oh ba oui (et le repaint() un peu partout change rien^^):
    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
    public class Piste extends JPanel 
    {	
    	private CommandePiste commande;
    	private GraphiquePiste graphique;
     
    	private boolean muet;
     
    	public Piste(File fichier)
    	{
    		super();
    		graphique = new GraphiquePiste(this);
    		commande = new CommandePiste(this);
    		muet = false;
    		setSize(1440,200);
    		setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
    		setBorder(new LineBorder(java.awt.Color.black));
    		add(commande);
    		add(graphique);
    	}
     
    	public void setMuet(boolean b)
    	{
    		muet = b;
    		graphique.repaint();
    	}
     
    	public boolean getMuet()
    	{
    		return muet;
    	}
    }
     
    public class CommandePiste extends JPanel implements ItemListener
    {	
    	private JCheckBox muetCheck;
    	private Piste piste;
     
    	public CommandePiste(Piste p)
    	{
    		piste = p;
    		setSize(new Dimension(200,200));
    		setBackground(java.awt.Color.LIGHT_GRAY);
    		muetCheck = new JCheckBox("Muet");
    		muetCheck.addItemListener(this);
    		add(muetCheck);
    	}
     
    	public void itemStateChanged(ItemEvent e) 
    	{
    		Object source = e.getItemSelectable();
    		if(source==muetCheck)
    		{
    			if(e.getStateChange()==ItemEvent.SELECTED) piste.setMuet(true);
    			if(e.getStateChange()==ItemEvent.DESELECTED) piste.setMuet(false);
    		}
    	}
     
    }
     
    public class GraphiquePiste extends JPanel 
    {	
    	private Piste piste;
     
    	public GraphiquePiste(Piste p)
    	{
    		super();
    		piste = p;
    		setPreferredSize(new Dimension(1240,200));
    	}
     
    	protected void paintComponent(Graphics g)
    	{
    		Dimension d = getSize();
    		g.setColor(java.awt.Color.WHITE);
    		g.drawRect(0, 0, d.height, d.width);
    		if(piste.getMuet()) g.setColor(java.awt.Color.BLUE);
    		else g.setColor(java.awt.Color.DARK_GRAY);
    		dessinerSon(g, d);
    	}
     
    	private void dessinerSon(Graphics g, Dimension d)
    	{
    		g.drawLine(0,d.height/2, d.width, d.height/2);
    	}
    }
    Le problème pourrait venir de GraphiquePiste??

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut validate()...?
    quand on ajoute un composant, normalement il faut faire appel à validate()

    C'est d'ailleurs ce qui est préconisé dans la javadoc, à la méthode add() de Container;

    If a component has been added to a container that has been displayed, validate must be called on that container to display the new component

    Peut-être une piste??? souvent il faut d'ailleurs faire:
    component.repaint();
    component.validate();

  12. #12
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Ah ba ouai, avec le validate() tout de suite après sur mon Centre, ça marche nickel, merci bien

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

Discussions similaires

  1. [TStatusBar] Comment ajouter des composants à un TStatusBar
    Par Higgins dans le forum Composants FMX
    Réponses: 18
    Dernier message: 10/06/2013, 15h33
  2. comment ajouter des composants au delphi
    Par hayat2 dans le forum Débuter
    Réponses: 3
    Dernier message: 23/05/2010, 13h00
  3. Comment ajouter un composant par programmation ?
    Par jojo86 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/01/2008, 13h30
  4. [C# express] Comment ajouter des composants à la palette d'outils?
    Par Jayceblaster dans le forum Visual Studio
    Réponses: 1
    Dernier message: 04/11/2006, 20h40
  5. Réponses: 2
    Dernier message: 07/08/2006, 16h43

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