Clone et Fenetre JAVA

Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009
-
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009
-
Bonjour, excusez-moi de vous déranger une nouvelle fois mais j'aimerais savoir s'il est possible de cloner une fenetre(ou plutot un JPanel) en java??
Merci d'avance.

29 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Ben tout dépend ce que tu appelle "cloner", mais il te suffit de faire une classe étendant de JPanel, et d'y mettre tes composants dedans, et chaque "clône" serait alors une nouvelle instance de ce panel.
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

OK mais le problème c'est que j'aimerais appliquer cette méthode lors d'un clic sur un bouton.
 

Et apparamment cela ne semble pas fonctionner
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Salut le voici en plus clair désolé pour les genes occasionnées. :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;

public class JTreeEvents extends JApplet implements ActionListener,Cloneable
{
/**
*
*/
private static final long serialVersionUID = 1L;
JTree tree;
JTextField jtf;
CardLayout Carte;
JPanel panneauDroite;
static JTextField nom,prenom,datedenaissance,loisirs,langagesinfos,age;
static JButton ok,nouveau;
static JButton nouvellephase2;
DefaultMutableTreeNode top,a;
static JPanel Phase1;

public void init()
{

nouveau = new JButton("Nouveau");
nouveau.addActionListener(this);

ok = new JButton("OK");
ok.addActionListener(this);

nouvellephase2 = new JButton("Nouvelle Phase 2");
nouvellephase2.addActionListener(this);

nom = new JTextField(10);
nom.addActionListener(this);

prenom = new JTextField(10);
prenom.addActionListener(this);

datedenaissance = new JTextField(10);
datedenaissance.addActionListener(this);

loisirs = new JTextField(10);
loisirs.addActionListener(this);

langagesinfos = new JTextField(10);
langagesinfos.addActionListener(this);

age = new JTextField(10);
age.addActionListener(this);

Container contentPane = this.getContentPane();

JPanel panneau = new JPanel(new BorderLayout());
panneauDroite = new JPanel();

JPanel Phase1 = new JPanel();
Phase1.add(new JLabel("Nom"));
Phase1.add(nom);
Phase1.add(new JLabel("Prenom"));
Phase1.add(prenom);
Phase1.add(new JLabel("Date de Naissance"));
Phase1.add(datedenaissance);
Phase1.add(ok);
Phase1.add(nouveau);

JPanel Phase2 = new JPanel();
Phase2.add(new JLabel("Loisirs"));
Phase2.add(loisirs);
Phase2.add(new JLabel("Langages infos"));
Phase2.add(langagesinfos);
Phase2.add(new JLabel("Age"));
Phase2.add(age);
Phase2.add(nouvellephase2);


Carte = new CardLayout();

panneauDroite.setLayout(Carte);
panneauDroite.add("Phase1",Phase1);
panneauDroite.add("Phase2",Phase2);

contentPane.add(panneau);
JPanel panneauTree = new JPanel(new BorderLayout());

JSplitPane unSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panneauTree,panneauDroite);
panneau.add(unSplitPane);

top = new DefaultMutableTreeNode("Options");

a = new DefaultMutableTreeNode("A");
top.add(a);

DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("A1");
a.add(a1);

DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("A2");
a.add(a2);

DefaultMutableTreeNode b = new DefaultMutableTreeNode("B");
top.add(b);

DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("B1");
b.add(b1);

DefaultMutableTreeNode b2 = new DefaultMutableTreeNode("B2");
b.add(b2);

tree = new JTree(top);

int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane(tree,v,h);

panneauTree.add(jsp, BorderLayout.CENTER);

jtf = new JTextField("",20);
panneauTree.add(jtf,BorderLayout.SOUTH);

tree.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent me)
{
doMouseClicked(me);
}
});
}

void doMouseClicked(MouseEvent me)
{
TreePath tp = tree.getPathForLocation(me.getX(), me.getY());

if (tp != null)
{

Object[] mytp = tp.getPath();

if (mytp.length >= 3)
{
jtf.setText(mytp[2].toString());
Carte.show(panneauDroite,"Phase2");
}
else if (mytp.length == 2)
{
jtf.setText(mytp[1].toString());
Carte.show(panneauDroite,"Phase1");
}
}

}
public Object clone()
{
try
{
return (JTreeEvents) super.clone();
}

catch(CloneNotSupportedException e)
{
throw new InternalError(e.getMessage());
}
}

public void actionPerformed(ActionEvent evt)
{
if(evt.getSource() == nouveau)
{


tree = new JTree(top);
int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane(tree,v,h);
DefaultMutableTreeNode coucou = new DefaultMutableTreeNode("Nouveau");
top.add(coucou);

///////////////////////////////////////////////////////////////
// C'est ici que j'aimerais cloner la meme fenetre
panneauDroite.add("Phase1",(Component) Phase1.clone());

SwingUtilities.updateComponentTreeUI(this);


}

if(evt.getSource() == nouvellephase2)
{
DefaultMutableTreeNode a3 = new DefaultMutableTreeNode("A2");
a.add(a3);
}
}
}
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Lol, ne pas confondre "membre club" qui est un rôle privilégié de Codes-Sources qui a accès à certains bonus aux administrateurs qui eux peuvent supprimer les messages du forum ;)

Il me semble qu'on t'avais déjà répondu à cette question : le JTree doit être raffraichie pour afficher les modifications :
top.UpdateUI();
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Oui mais en ecrivant un Update UI(); il me dit que la méthode UpdateUI n'est pas defini pour DefaultMutableTreeNode.

Je suis de te deranger comme ca mais je n'y arrive absolument pas.
:(
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Non, l'updateUI c'est sur le JTree qu'il faut le faire, pour que la vue soit raffraichie, et non sur le Model du JTree qui lui n'est qu'une façon de stocker les données.
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Tu veux dire que c'est dans mon ActionPerformed que la vue est rafraichie?

Tout bug en ce moment

J'arrive à créer des nouveaux dossiers mais impossible d'y mettre le meme contenu avec la methode clone, et des lors que je clic, sur "Nouveau" tout plante.chaque branche et sous-branche de l'arbre affichent la meme fenetre.

:(:(:
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Evite d'utiliser la fonction clone, et crée une nouvelle instance avec les valeurs que tu veux, c'est plus sûr.

C'est en effet dans l'actionPerformed qu'il faut que tu raffraichisse ton JTree après lui avoir ajouté un noeud (par UpdateUI() donc).
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Je suis désolé DarkSidious mais je ne vois absolument pas comment faut-il faire ce que tu me dis.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
public void actionPerformed(ActionEvent evt)
{
if(evt.getSource() == nouveau)
{
tree = new JTree(top);
int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane(tree,v,h);
DefaultMutableTreeNode coucou = new DefaultMutableTreeNode("Nouveau");
top.add(coucou);

///////////////////////////////////////////////////////////////
// C'est ici que j'aimerais cloner la meme fenetre
panneauDroite.add("Phase1", (Component) Phase1.clone());  // a remplacer par une nouvelle instance d'un JPanel

top.UpdateUI()
;
}
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
Pas tout a fait daccord avec toi darksidious ;o) la methode clone fait partie ;o) des attout du model de programation objet ;o) seulement il est vrai qu elle ne se prete pas trop au clonage des ihm car tres lourd a faire ;o)
et justement
l erreur du code de Cicin c est q il a cru s en sortir en apellant la methode super... ;o) rien n est reelement magique en prog objet ;o) c est tout les comportement que l on programme qui le rende magique ;o) éhhé ..
donc A toi de faire ta methode CLONE c est à cela que sert la surcharge
Ensuite je rapelle qu un clone est une copy exacte de l objet et de ses états ... et la je doute que ce soit exactement ce que tu veux!!!
en ce sens darksidious a surement raison ;o) !!! ?

Bonne chance ;o)

PS : dit donc on commence à le voir souvent ce morceau de code ;o) !! !et c est de pir en pir  ;o)

GodConan ;o)
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Que veux-tu que je te dise GodConan, je suis debutant en prog donc voila je fais ce que je peux, je ne suis qu'un debutant par rapport à vous c'est pour cela que je demande de l'aide.
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Salut,Le but c'est de créer une nouvelle branche dans laquelle lors du clic je peux mettre mon panel Phase1 contenant les memes elements.
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

J'ai rajouté une classe de ce type:
public JPanel clone()
{
JPanel panneau = null;

try
{
panneau = (JPanel)super.clone();
}

catch(CloneNotSupportedException e)
{
throw new InternalError(e.getMessage());
}

return panneau;
}

et apres je fais dans mon ActionPerformed:
panneauDroite.add("Phase1", (JPanel)Phase1.clone());

Mais ici il m'indique que la méthode clone() de type Object n'est pas visible :S:S
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
;o) ... bon en fait ABANDONNE l idee de clone ;o) je me suis donc mal exprimé ;o) ...
Mon probleme pour te fournir un petit exemple c est qu il est vraiment difficile de voir ou tu veux en venir !!!?
et meme ce que tu veux obtenir!!

GodConan ;o)
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
Ps : un petit dessin c est souvent plus parlant ... ;o)

GodConan ;o)
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

OK GodConan, je vais essayer d'être le plus explicite possible.

D'abord avant de commencer je te remercie encore une fois toi et tous les autres memebres(Twinuts,DARKSIDIOUS etc...) de lire et repondre aux multiples questions que j'ai posées depuis le début,je sais cela devient .......


Alors:

Je crée une fenêtre comme tu l'as vu dans le programme , coupé en deux :

---A Gauche , il y a un arbre avec deja deux branches A et B et deux sous branches: A->A1,A2 B->B1,B2

-- A Droite, il y a un formulaire et meme deux.

Quand je clique sur une branche , je dois avoir un formulaire(en l'occurence celui ou il y a "Nom,Prenom,... un bouton Nouveau")

Quand je clique sur une sous-branche il y a un deuxieme formulaire avec "Loisirs,Langagesinfos etc"

Jusqu'ici tout va bien

Après ce que je veux faire c'est :

Quand je clique sur Nouveau, il faut:

1-Une nouvelle branche se crée
2-Et lorsque je cliquerai sur cette nouvelle branche s'affichera le formulaire exactement identique aux autres branches d'arbres existantes.

Quand je clique sur Nouveau, une nouvelle branche se crée mais:

-- dans les sous-branches, je ne retrouve plus mon deuxieme formulaire.

Voila le PROBLEME MAJEUR que j'ai :(:(:(:(

Merci d'avance.
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

En resumé , j'aimerai avoir pour toute branche la fenetre Nom Prenom .....

et pour toute sous-branche:  Loisirs,Langagesinfos etc...

Et que les boutons puissent tjs etre activés.

Bref que je puisse manipuler mon arbre.
Voila.
Encore Merci infiniiiiiiiiiiiiiiiiiiiiment de me sauver
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Oulà oulà oulà, je n'ose comprendre !

Tu veux, si j'ai bien compris, que pour chaque noeud, avoir un panel rattaché. Jusque là ok.
Mais quel est l'intérêt d'avoir 15 panel IDENTIQUES pour 15 noeuds DIFFERENTS ?

Est-ce que ton but au final ne serait pas d'afficher des informations concernant un noeud sélectionné dans un panel ? Et pour faire ceci, tu as eu la mauvaise idée d'afficher LE panel correspondant au noeud, et masquer les autres ? Est-ce que je vois juste ?

Si c'est cà, je te déconseille très fortement de faire ceci : au lieu de masquer et afficher les panels, utilise-en qu'un qui gère l'affichage des valeurs selon le noeud sélectionné, ce sera ainsi BEAUCOUP plus simple !
Messages postés
221
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
16 janvier 2009

Il n'y a aucun intérêt de mettre 15 Panels Différents.

Mais je souhaite:

J'appui sur Nouveau donc j'ai une nouvelle branche qui se créee dans laquelle il y a le meme formulaire.

Mais ca plante qqpart car dans ma sous branche deja crée le deuxieme formulaire n'apparait meme pas.

A la fin l'ideal c'est d'etre capable de créer autant de branches que de sous-branches que veut l'utilisateur avec pour la branche un type de formulaire(Nom,Prenom...)
et pour une sous-branche un autre type de formulaire(Loisirs,Langagesinfos....)

Voila.