[Java] réafficher une ancienne selection dans un JTree

réafficher une ancienne selection dans un JTree [Java] - Java - Programmation

Marsh Posté le 14-01-2003 à 08:27:36    

Je fais une sélection dans un jTree et je récupère :
    selectedPathsVarNames = vnTree.getSelectionPaths();
je la garde en mémoire, j'efface le jTabbedPane1 dans lequel il se trouve.
j'en recrée un nouveau avec le jTree vnTree1
 
Je voudrais que l'ancienne sélection soit de nouveau visible, je fais :
    vnTree1.setSelectionPaths(selectedPathsVarNames);
    vnTree1.repaint();
 
et là pas de surlignement des noeuds anciennements sélectionnés .....
 
la sélection est bien appliquée car je la récupère avec un getSelectionPaths
mais elle n'est pas visible.
 
Qu'est ce que j'ai oublié de faire ?????

Reply

Marsh Posté le 14-01-2003 à 08:27:36   

Reply

Marsh Posté le 14-01-2003 à 10:29:38    

Tu dis que les noeuds sélectionnés ne sont pas visibles, mais : cela veut-il dire que les noeuds ne sont simplement pas surlignés, ou qu'ils ne sont carrément pas visibles (auquel cas il faut faire aussi des expand()) ?

Reply

Marsh Posté le 14-01-2003 à 10:33:57    

Oui désolé, je voulais dire que les noeuds ne sont pas surlignés.

Reply

Marsh Posté le 14-01-2003 à 10:42:51    

Pas de souci, en fait c'est moi qui ne sais pas lire, c'était clair dans le premier post.

Reply

Marsh Posté le 14-01-2003 à 12:23:31    

ton repaint, tu le fais comment? Dans un thread? Dans Action?

Reply

Marsh Posté le 14-01-2003 à 12:41:48    

Je ne comprend pas la question (je débute), le repaint est fait là :
 
public class MyJPanelVarNames extends javax.swing.JPanel {
   
  JTree vnTree;
  String[] tabRecord;
  String[][][] tabVarByRec;
  int iVarSelectedByRec[];
  TreePath[] selectedPathsVarNames;  
   
  /** Creates new form MyJPanelVarNames */
  public MyJPanelVarNames(JTree pvnTree, String[] ptabRecord, String[][][] ptabVarByRec) {
    vnTree = pvnTree;
    tabRecord = ptabRecord;
    tabVarByRec = ptabVarByRec;
     
    initComponents();
     
      if(WdView.selectedPathsVarNames != null && WdView.FileVarNumber == WdView.tabInfosNumber[2]) {
        selectedPathsVarNames = WdView.selectedPathsVarNames;
        vnTree.setSelectionPaths(selectedPathsVarNames);
        vnTree.repaint();
      }
    }

Reply

Marsh Posté le 14-01-2003 à 13:40:51    

En Java, les objets grapiques de javax.swing ne peuvent être modifier qu'avant appel à Windows.show() (ou paint()), ou dans la fonction run d'un thread, ou encore pendant le traitement d'une action (dans la fonction ActionPerformed(Event evt) par exemple). ET NULLE PART AILLEURS ... donc c'est normal que tes selections ne soient pas sous-ligné, le repaint est fait après show() ...

Reply

Marsh Posté le 14-01-2003 à 14:14:47    

western a écrit :

En Java, les objets grapiques de javax.swing ne peuvent être modifier qu'avant appel à Windows.show() (ou paint()), ou dans la fonction run d'un thread, ou encore pendant le traitement d'une action (dans la fonction ActionPerformed(Event evt) par exemple). ET NULLE PART AILLEURS ... donc c'est normal que tes selections ne soient pas sous-ligné, le repaint est fait après show() ...


 
et validate() ca sert a quoi ? :o

Reply

Marsh Posté le 14-01-2003 à 14:48:59    

Tu veux invalidate(), non ? (de la même classe java.awt.Component)

Reply

Marsh Posté le 14-01-2003 à 15:04:55    

J'ai fait des essais avec vos observations et je me suis rendu compte que si je fais une nouvelle sélection à la souris et que je rappelle les anciennes avec :
 
private void jTabbedPane1MouseReleased(java.awt.event.MouseEvent evt) {
      vnTree.setSelectionPaths(selectedPathsVarNames);
      vnTree.invalidate();   // ou validate ou repaint()
  }
 
le surlignage des nouvelles est complètement supprimé
 
Apparemment, il y a bien une modification qui se produit mais pas vraiment celle que je cherche...

Reply

Marsh Posté le 14-01-2003 à 15:04:55   

Reply

Marsh Posté le 14-01-2003 à 16:51:06    

Moi, j'vous dis, ça sent la séance de débogage du JDK, ça...  :ange:

Reply

Marsh Posté le 15-01-2003 à 06:48:46    

je suis perplexe mais je n'ose pas encore mettre en cause le JDK vu mon niveau en Java :lol:

Reply

Marsh Posté le 15-01-2003 à 18:23:51    

Bon, HappyHarry, explique comment tu fais alors!!!
Mettre en cause JDK? les mecs qui le font sont de loin meilleurs que nous alors avant de mettre en cause, étudie!
 
Les slides de mon prof de Java sont plus explicites que moi: http://users.info.unicaen.fr/~sauv [...] threads.ps
Dans cette doc. regarde la partie GUI ...
Bonne lecture!

Reply

Marsh Posté le 15-01-2003 à 19:17:20    

western a écrit :

Bon, HappyHarry, explique comment tu fais alors!!!
Mettre en cause JDK? les mecs qui le font sont de loin meilleurs que nous alors avant de mettre en cause, étudie!
 
Les slides de mon prof de Java sont plus explicites que moi: http://users.info.unicaen.fr/~sauv [...] threads.ps
Dans cette doc. regarde la partie GUI ...
Bonne lecture!


 
je t'ai pas attendu pour étudier tout ca, je me contenterai de ca :
 


public void validate()
 
    Validates this container and all of its subcomponents.
 
    The validate method is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layout-related information changed) after the container has been displayed.  


 
maintenant si tu as toujours du mal a lire, tu peux toujours te faire aider par ton cher professeur pour te traduire
 

Reply

Marsh Posté le 15-01-2003 à 19:25:02    

[:blueflag] topicalire


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 15-01-2003 à 19:41:43    

[:cupra]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 16-01-2003 à 10:20:33    

D'accord, ce qu'ils disent est beau ... si j'ai bien compris, tu utilise cette méthode! Dans ce cas peux tu me dire pourquoi le code suivant ne marche pas (la barre de défilement ainsi que le contenu du label ne sont mis à jour)?
 

Code :
  1. /*!
  2.   Cette classe doit permettre de ...
  3. */
  4. import java.io.*;
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. import javax.swing.*;
  8. import javax.swing.event.*;
  9. public class VerificationValidate
  10. {
  11.     private final static JFrame fenetre = new JFrame();
  12.     private final JLabel label = new JLabel("" );
  13.     static private String contenu_label = new String();
  14.     private JProgressBar pb = new JProgressBar(0, 1000);
  15.     static private int valeur_pb = 0;
  16.     private JButton annuler = new JButton("Cancel" );
  17.     static private boolean valeur_annuler = false;
  18.    
  19.     private void construitFenetre()
  20.     {
  21. Container cp = fenetre.getContentPane();
  22. cp.removeAll();
  23. cp.setLayout(new GridBagLayout());
  24. label.setText(contenu_label);
  25. constrain(cp,label,0,0,1,1,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER,1.0,1.0,0,0,0,0);
  26. constrain(cp,pb,0,1,1,1,GridBagConstraints.BOTH,GridBagConstraints.CENTER,1.0,1.0,0,0,0,0);
  27. constrain(cp,annuler,0,2,1,1,GridBagConstraints.NONE,GridBagConstraints.CENTER,1.0,1.0,0,0,0,0);
  28. fenetre.setSize(400, 100);
  29. fenetre.addWindowListener(new WindowAdapter()
  30.     {
  31.  public void windowClosing(WindowEvent e)
  32.  {
  33.      valeur_annuler = true;
  34.  }
  35.     });
  36. annuler.addActionListener(new ActionListener()
  37.     {
  38.  public void actionPerformed(ActionEvent evt)
  39.  {
  40.      valeur_annuler = true;
  41.  }
  42.     });
  43.     }
  44.     private void constrain(Container container,Component component,int grid_x,int grid_y,int grid_width,int grid_height,int fill,int anchor,double weight_x,double weight_y,int top,int left,int bottom,int right)
  45.     {
  46. GridBagConstraints c = new GridBagConstraints();
  47. c.gridx      = grid_x;
  48. c.gridy      = grid_y;
  49. c.gridwidth  = grid_width;
  50. c.gridheight = grid_height;
  51. c.fill       = fill;
  52. c.anchor     = anchor;
  53. c.weightx    = weight_x;
  54. c.weighty    = weight_y;
  55. if (top+bottom+left+right > 0) c.insets = new Insets(top, left, bottom, right);
  56. ((GridBagLayout)container.getLayout()).setConstraints(component, c);
  57. container.add(component);
  58.     }
  59.    
  60.     public VerificationValidate()
  61.     {
  62. contenu_label = "Preparing...";
  63. valeur_pb = 0;
  64. construitFenetre();
  65. fenetre.show();
  66.     }
  67.     public boolean copier(File file_in, File file_out)
  68.     {
  69. fenetre.setTitle("Copy "+file_in.getName()+" sur "+file_out.getName());
  70. boolean res = true;
  71. long taille_in = file_in.length();
  72. int i = 0;
  73. int j;
  74. try
  75.     {
  76.  BufferedInputStream in = new BufferedInputStream(new FileInputStream (file_in));
  77.  DataOutputStream out = new DataOutputStream(new FileOutputStream(file_out));
  78.  while(
  79.        ((j = in.read()) >= 0)
  80.        &&
  81.        (!valeur_annuler)
  82.        )
  83.      {
  84.   valeur_pb = (int) (1000 * ((double)i++) / ((double)taille_in));
  85.   out.write(j);
  86.   fenetre.validate();
  87.      }
  88.     }
  89. catch(Exception e)
  90.     {
  91.  JOptionPane.showMessageDialog(
  92.           fenetre,
  93.           "Error occurs during copy.",
  94.           "Error:",
  95.           JOptionPane.ERROR_MESSAGE);
  96.  res = false;
  97.     }
  98. return res;
  99.     }
  100.     public static void main(String[]argv)
  101.     {
  102. if(argv.length != 2)
  103.     {
  104.  JOptionPane.showMessageDialog(
  105.           null,
  106.           "Il faut preciser le nom de fichier source et le nom de fichier arriv? ...",
  107.           "Error:",
  108.           JOptionPane.ERROR_MESSAGE);
  109.  System.exit(1);
  110.     }
  111. VerificationValidate vv = new VerificationValidate();
  112. File file_in = new File(argv[0]);
  113. if(! file_in.exists())
  114.     {
  115.  JOptionPane.showMessageDialog(
  116.           null,
  117.           "Le fichier source n'existe pas",
  118.           "Error:",
  119.           JOptionPane.ERROR_MESSAGE);
  120.  System.exit(1);
  121.     }
  122. File file_out = new File(argv[1]);
  123. if(vv.copier(file_in, file_out))
  124.     {
  125.  JOptionPane.showMessageDialog(
  126.           null,
  127.           "La copie: tout va bien",
  128.           "Error:",
  129.           JOptionPane.INFORMATION_MESSAGE);
  130.  System.exit(0);
  131.     }
  132. else
  133.     {
  134.  JOptionPane.showMessageDialog(
  135.           null,
  136.           "La copie: tout va mal ;-)",
  137.           "Error:",
  138.           JOptionPane.ERROR_MESSAGE);
  139.  System.exit(1);
  140.     }
  141.     }
  142. }

 

Reply

Marsh Posté le 16-01-2003 à 11:00:06    

HappyHarry a écrit :


 
je t'ai pas attendu pour étudier tout ca, je me contenterai de ca :
 


public void validate()
 
    Validates this container and all of its subcomponents.
 
    The validate method is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layout-related information changed) after the container has been displayed.  


 
maintenant si tu as toujours du mal a lire, tu peux toujours te faire aider par ton cher professeur pour te traduire
 
 


 
désolé mais je suis d'accord avec western, un repaint() se fait avant un window.show() ! la description de validate ne précise nulle part qu'un repaint() est fait sur les composants du container !
 
candide2, si tu n'arrives pas à arranger ton pb, tu peux peut-être sauvegarder les éléments surlignés de ton jTree dans un vector, et ensuite quand tu le mets ds les nouveau pane, tu effaces toutes les sélections et tu les remets en utilisant ton vector... ça peut peut-être marcher ?

Reply

Marsh Posté le 16-01-2003 à 11:06:12    

candide2 a écrit :

je suis perplexe mais je n'ose pas encore mettre en cause le JDK vu mon niveau en Java :lol:


Je ne voulais pas dire mettre en cause le JDK. Mais il y a des fois où c'est instructif de savoir comment il fonctionne, de l'intérieur (c'est bien pour cela que ses sources Java sont fournis avec le JDK, d'ailleurs).

Reply

Marsh Posté le 16-01-2003 à 11:14:55    

:lol: bon courage pour la noyade dans les sources de JDK

Reply

Marsh Posté le 16-01-2003 à 12:24:08    

Seulement sous débogueur, sinon on ne s'en sort pas...  
 
Swing n'est pas si mal conçu que cela, vous savez, et on s'habitue rapidement à ses différentes couches, vues du débogueur.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed