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 :

[JTree][Ajout+Edition] jlabel du renderer trop petit


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut [JTree][Ajout+Edition] jlabel du renderer trop petit
    Salut,

    J'ai un petit souci de renderer :

    Lorsque j'ajoute un noeud de mon arbre, je lance une édition automatique de ce noeud (qui doit être de la forme attribut:valeur). Apres avoir validé l'édition de ce noeud, je me retrouve avec un jlabel trop petit, et donc trois points de suspension à l'affichage de l'arbre.

    Voici mon renderer (qui basiquement ne change que les icones) :

    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
     
    	/**TREE RENDERER**/
     
     
    	private class MyRenderer extends DefaultTreeCellRenderer 
    	{
    		/*Icon tutorialIcon;
     
    		public MyRenderer(Icon icon) 
    		{
    			tutorialIcon = icon;
    		}*/
     
    		public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus) 
    		{
     
    			super.getTreeCellRendererComponent(tree, value, sel,expanded, leaf, row,hasFocus);
     
    			MyNode nd=(MyNode)value;
     
    			Toolkit tk=Toolkit.getDefaultToolkit();
     
    			if(!leaf) 
    			{
    				if(nd.checkIsLocked())
    				{
    					setIcon(new ImageIcon(tk.createImage("images/folderLocked.png").getScaledInstance(20, 20, Image.SCALE_SMOOTH )));
    					setToolTipText(nd.getUserLock());
    				}
    				else
    				{
    					setIcon(new ImageIcon(tk.createImage("images/folder.jpg").getScaledInstance(20, 20, Image.SCALE_SMOOTH )));
    				}
     
    			} 
    			else 
    			{
    				if(((MyNode)(nd.getParent())).checkIsLocked())
    					setIcon(new ImageIcon(tk.createImage("images/fileLocked.jpg").getScaledInstance(20, 20, Image.SCALE_SMOOTH )));
    				else
    					setIcon(new ImageIcon(tk.createImage("images/file.jpg").getScaledInstance(20, 20, Image.SCALE_SMOOTH )));
    			}
     
     
    			return this;
    		}
     
    	}
    La fonction d'ajout du noeud (evenement sur un menu clic droit, se trouvant dans ma frame) :

    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
     
    public void actionPerformed(ActionEvent e)
    		{
    			tree.requestFocus();
     
    			TreePath path = tree.getSelectionPath();
    			if(path==null)
    				return;
     
    			DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
     
    			if(node.isLeaf())
    			{
    				node=(DefaultMutableTreeNode)(node.getParent());
    				/*JOptionPane.showMessageDialog(null,LanguageManager.getLocalizedText("ImpossibleAction"),LanguageManager.getLocalizedText("ImpossibleActionTitle"),JOptionPane.ERROR_MESSAGE);
    				return;*/
    			}
     
     
     
    			//DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
     
    			if(node==null)
    			{
    				////System.out.println("node==null !!");
    				return;
    			}
     
    			////System.out.println("pas de null");
     
    			if(node.toString().contains(XMLTree.SEPARATOR))
    				return;
     
    			MyNode newNode = new MyNode("Title"+XMLTree.SEPARATOR+"Detail",false,tree);
     
    			((DefaultTreeModel) tree.getModel()).insertNodeInto(newNode, node, node.getChildCount());
    			//System.out.println("juste avant unsetFolderAlone");
    			((MyNode)node).unsetFolderAlone(); 
    			tree.expand(node);
     
    			newNode=tree.getThisNode(tree.getRoot(),newNode);
     
    			tree.startEditingAtPath(new TreePath(newNode.getPath()));
    		}
    La fonction après édition (evenement qui se trouve dans ma classe étandant l'arbre):

    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
     
    public void treeNodesChanged(TreeModelEvent e) 
    		{
    			DefaultMutableTreeNode node;
    			node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());
    			/*
    			 * If the event lists children, then the changed
    			 * node is the child of the node we have already
    			 * gotten.  Otherwise, the changed node and the
    			 * specified node are the same.
    			 */
    			try 
    			{
    				if(e.getChildIndices()!=null)
    				{
    					int index = e.getChildIndices()[0];
    					node = (DefaultMutableTreeNode)(node.getChildAt(index));
    				}
     
    				if(node.isLeaf())
    				{
    					String[] s = node.toString().split(SEPARATOR);
    					if(s.length!=2)
    					{
    						s=node.toString().split(":");
    						if(s.length!=2)
    						{
    							node.setUserObject("Title"+SEPARATOR+s[0].trim());
    						}
    						else
    						{
    							node.setUserObject(s[0].trim()+SEPARATOR+s[1].trim());
    						}
    					}
    					else
    					{
    						//rien à faire
    					}
    					updatePane((MyNode)(node.getParent()));
    				}
     
     
    			} catch (NullPointerException exc) 
    			{
    				exc.printStackTrace();
    			}
    			//System.out.println("The user has finished editing the node.");
    			//System.out.println("New value: " + node.getUserObject());
     
    			save();
    			repaint();
     
    		}
    Je pensais que le repaint ferait que le jlabel se redimensionnerai bien, mais il n'en est rien.

    Comment faire en sorte qu'il se dimensionne bien ?

    Merci d'avance

    Fred

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le repaint ne s'occupe pas de recalculer les tailles des composants.
    C'est le revalidate qui s'occupe de ça logiquement.

    Toutefois les renderers sont des cas à part donc je ne peux assurer du résultat.

    Bon sinon en passant ton Renderer alourdit sévèrement les choses.

    Il recharge à chaque fois les icône c'est long long long tu peux aussi bien les charger une seule fois dans le construteur.

    De plus la méthode getScaledInstance est à éviter comme la peste vu qu'elle est 100% software et lente au possible. cf cet article de Chris Campbell: The Perils of Image.getScaledInstance() ou encore les sorties de gfx d'il y a quelques années en ces lieux.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/07/2012, 10h19
  2. Réponses: 1
    Dernier message: 30/12/2010, 15h51
  3. Réponses: 4
    Dernier message: 12/09/2007, 15h33
  4. [JTree] modifier editer supprimer
    Par agougeon dans le forum Composants
    Réponses: 2
    Dernier message: 18/05/2005, 15h41
  5. [JTree] Ajouter une scrollbar
    Par Farias dans le forum Composants
    Réponses: 2
    Dernier message: 29/10/2004, 00h21

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