Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : JFileChooser et client/server [ Archives / RemoteMethodInvoke ] (guit38)

lundi 16 août 2004 à 17:17:39 | JFileChooser et client/server

guit38

bonjour

J'ai une application client/serveur, et je souhaite voir et sélectionner à partir du programme client des fichiers situés sur un ordinateur distant (où tourne l'application serveur).

Pour cela j'ai utilisé un JFileChooser. J'ai également surchargé les classes File et FileSystemView. Mes surcharges utilisent RMI pour exécuter chacune des méthodes (de File et de FileSystemView) sur le serveur distant.
ça marche et je peux choisir les fichiers distants et en sélectionner un.

Le problème c'est que sur une platform windows, je ne peux pas atteindre "poste de travail". Si je choisit de mettre le dossier courant de mon JFileChooser sur le disque C:/ de mon serveur, je ne peux pas choisir un fichier situé sur un autre disque puisque je ne peux pas remonter au dela de la racine C:/ pour atteindre "poste de travail".

Si quelqu'un pouvait m'aider, parce que là je lutte!




lundi 16 août 2004 à 20:02:59 | Re : JFileChooser et client/server

gmi19oj19

Membre Club
Utilise ton application sous linux

mardi 17 août 2004 à 00:21:26 | Re : JFileChooser et client/server

Dobel

euh, j'ai une solution toute conne :
tu changes le LookAndFeel de ton programme et tu utilises celui du système :

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
e.printStackTrace();
}

et là, magie, hop , dans ton JFileChooser, tu as accès au poste de travail, aux favoris réseaux...

A+

Dobeliou
[Il ne faut jamais jouer à saute-mouton avec une licorne]

mardi 17 août 2004 à 10:21:50 | Re : JFileChooser et client/server

guit38

le changement de lookAndFeel n'a rien donné (merci quand même ;). De plus si je tire mes surcharges (de File et FileSystemView), je fais donc pointer mon JFileChooser sur l'ordinateur client, le lookAndFeel n'empêche pas de remonter au poste de travail.


mardi 17 août 2004 à 10:39:02 | Re : JFileChooser et client/server

wargre

c'est pas un probleme de File.listRoots

mardi 17 août 2004 à 15:26:09 | Re : JFileChooser et client/server

guit38

la méthode listRoots de la classe File est static, je ne l'ai donc pas surchargée. cependant elle n'est pas utilisée si je fait tournée mon programme client en debug. Mais ça doit être une histoire de ce genre. En fait la méthode utilisée c'est getRoots dans FileSystemView. Cette méthode retourne "Desktop" sur une platform windows.
je pense que le problème vient de la méthode getParentFile() de la classe File mais qui est surchargée dans la classe sun.awt.shell.ShellFolder ou Win32ShellFolder. D'ailleurs je n'ai ne sait pas où trouver les sources de ces classes, elles ne sont pas dans l'API.

mardi 17 août 2004 à 16:39:54 | Re : JFileChooser et client/server

wargre

bref appelle java.io.FileSystemView.getRoots() dans le getRoots de ta classe et ajoute tes racines.

samedi 12 février 2005 à 01:41:04 | Re : JFileChooser et client/server

desastreux

Bonsoir grands chefs !

Je cherche à lister des dossiers partagés sur ordinateur distants (en réseau local LAN), et je sens bien que vous tous... cherchez à cacher quelque-chose à ce sujet dans ce post !
Actuellement, mon (tout petit) code se contente bêtement de repertorier les noms et IP des machines présentes dans mon masque réseau, et j'aimerais désormais pouvoir connaître les dossiers (et fichiers) partagés sur ces machines. Or, avec :

File[] drive;
drive = File.listRoots();
for (int i = 0; i < drive.length; i++) { System.out.println(drive[i].toString()); }

On obtient les disques en présence sur notre propre machine 127.0.0.1 (localHost ou 192.168.0.1 sur mon réseau, en l'occurence) :
Sauriez-vous comment faire pour spécifier que cette recherche se fasse sur, par exemple : 192.168.0.(1<X<255) (une machine distante de mon réseau)  ?
J'imagine que cela provoquerait des exceptions en ce qui concerne ce qui n'est pas partagé, mais peut-être est-ce possible malgré tout ?
J'ai bien essayé de me renseigner à propos des class RMI, mais je suis perdu entre les "synchronized" et autres "sockets" qui semblent s'éloigner de mon but, avec notamment la nécéssité de retrouver java sur les 2 machines client/serveur...
A propos des class "FileSystemView" dont vous parlez : 
Chez moi, je ne trouve que "java.io.fileSystem" et "java.io.win32FileSystem" qui, de plus, ne sont pas "public" et que je ne peux donc pas appeller depuis mon code pour essayer votre fameux "getRoots".
Je crains de toute façon de ne pas avoir le niveau, si elles sont accessibles grçace à un tour de passe-passe, pour aller les implémenter avec les non-moins menaçantes "RMI" !
Au risque de passer pour un flegmard, n'y a-t'il pas plus simple ?
Serait-ce abuser, surtout en réponse à une demande d'aide, d'en demander à mon tour ?
J'ai cru comprendre que votre soucis venait se situer à un niveau graphique lors de la représentation des ordinateurs et des disques, mais que vous pouviez d'ores et déjà accèder aux fichiers; votre aide me serait donc trés précieuse, merci.
 

vendredi 20 mai 2005 à 16:12:53 | Re : JFileChooser et client/server

desastreux

Bonjour, Bonsoir...
Quelques mois de méditation et quelques caractères plus gros que des maisons plus tard, j'ai eu l'opportunité de tomber sur un code qui permettait d'avoir l'interface d'un explorateur de fichiers en JAVA, déjà tout fait, et qui comprends notamment le fameux Favoris Réseau de Windows et donc, les racines des partages que je cherchais ci-dessus. Le but essentiel de mon application était de trouver ces partages plus vite que ne le fait Windows dans son propre explorateur : Dans un premier temps, donc, j'avais utilisé le résultat de la commande "netview.exe" pour y parvenir :

//**********************************************************************************
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
import util.Vector;
//(...)
Vector SourceSharedFolders = new Vector();
try
{
   Process process = Runtime.getRuntime().exec("net view
\\\\" + PCname );
   BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
   String s=reader.readLine();
   do
   {
      if ((s != null)&&( s.length() > 12))
      {
          for (int i = 0; i < (s.length() - 11); i++)
          {
            if ( (s.substring(i, i + 12)).compareTo("      Disque") == 0)
           {
               for (int j=i+13; j <s.length(); j++) { if (s.charAt(j)!=' ') break; }
               s=s.substring(0,i);
               for (int k=0; k < i; k++)
               { // Il va falloir purger certains caractères spéciaux mal convertis entre dos-windows et java 
                  if ( s.charAt(k)=='‚' ) s = s.substring(0,k) + 'é' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='š' ) s = s.substring(0,k) + 'è' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='‡' ) s = s.substring(0,k) + 'ç' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='…' ) s = s.substring(0,k) + 'à' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='ù' ) s = s.substring(0,k) + '¨' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='œ' ) s = s.substring(0,k) + '£' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='Ï' ) s = s.substring(0,k) + '¤' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='—' ) s = s.substring(0,k) + 'ù' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='æ' ) s = s.substring(0,k) + 'µ' + s.substring(k+1,i);
                  else  if ( s.charAt(k)=='õ' ) s = s.substring(0,k) + '§' + s.substring(k+1,i);
                } // Une exception sera levée en cas d'un autre caractère spécial non pris en compte ici...
                SourceSharedFolders.addElement(s);
                System.out.println(s);
              }
            }
          }
         }
          while (s !=  null);
           reader = null;
        }
        catch (IOException ioE)
        {
           ioE.printStackTrace();
           System.out.println("ERRREUR durant l'éxécution de la commande \" Net View \" de windows.");
         }
//**********************************************************************************

Cela fonctionne nickel, mais vous en conviendrez, cela ressemble à un bricolage dangereux avec du scotch !!! Et de plus, JAVA étant multiplateforme, on pouvait regretter l'utilisation d'un code natif pour parvenir àca résultat... Donc j'ai essayé avec le code suivant, de récupérer les String/URL correspondant aux dossiers racines des partages de chaque machine ( "PCname" corresponds au nom du PC surlequel on veut faire la recherche, et s'obtient avec un PING  sur IP :
 namePC = InetAddress.getByName(IP).getHostName().toString();
 if (!namePC.startsWith(ip.toString())) { // PING OK, le PC à cette IP a un nom et donc existe } 
) Bref, voici une alternative à NetView.exe pour les partages de fichiers en JAVA :

//**********************************************************************************
import javax.swing.filechooser.FileSystemView;
//(...)
Vector SourceSharedFolders = new Vector();
File[] rootsOS = FileSystemView.getFileSystemView().getRoots();
rootsOS = rootsOS[0].listFiles();
for (int lfr = 0; lfr < rootsOS.length; lfr++) 
{ // Sous windows, donc , l'un des premiers ROOTS présent sur le Bureau est "Favoris réseau" :
   if (rootsOS[lfr].toString().compareTo("Favoris réseau") == 0) 
   {
      rootsOS = rootsOS[lfr].listFiles();
      for (int ltr = 0; ltr < rootsOS.length; ltr++) 
     { // Dans "Favoris réseau", on trouve des raccourcis et notamment "Tout le réseau"
        if (rootsOS[ltr].toString().compareTo("Tout le réseau") == 0) 
         { //System.out.println(rootsOS[ltr] + " OK ! Recherche du réseau MS Windows... ");
            rootsOS = rootsOS[ltr].listFiles();
             for (int lrW = 0; lrW < rootsOS.length; lrW++) 
            { // Dans "Tout le réseau", on trouve des raccourcis et notamment "Réseau Microsoft Windows"
               if (rootsOS[lrW].toString().compareTo("Réseau Microsoft Windows") == 0) 
               {
                  rootsOS = rootsOS[lrW].listFiles();
                  for (int lD = 0; lD < rootsOS.length; lD++) 
                  { // Dans "Réseau Microsoft Windows", on on cherche dans chaque Domaine,
                     File[] rootsDOM = rootsOS[lD].listFiles();
                      for (int lh = 0; lh < rootsDOM.length; lh++) 
                     { // Dans chaque domaine, on va chercher PCName 
                        if (rootsDOM[lh].toString().length() < PCname.length())return; 
                        if (rootsDOM[lh].toString().substring( (rootsDOM[lh].
                            toString().length() - 1 - PCname.length()),
                            (rootsDOM[lh].toString().length() - 1)).toUpperCase().
                            compareTo(PCname) == 0) 
                        { // En cas de succès, on continue la recherche au cas où plusieurs PC présenteraient le même nom dans des Domaines différents.
                          rootsDOM = rootsDOM[lh].listFiles();
                          if (rootsDOM.length > 0) {
                            for (int ls = 0; ls < rootsDOM.length; ls++) {
                              SourceSharedFolders.addElement(rootsDOM[ls].
                                  toString());
                              //System.out.println(rootsDOM[ls].toString());
                            }
                          }
                          else { System.out.print(" Aucun partage trouvé pour " + PCname); }
                        }
                      }
                    }
                    break; // Fin d'étude des domaines : Pas besoin de voir pour le reste...
                  }
                }
              }
            }
          }
        }
//**********************************************************************************

Mais là encore, le résultat ressemble à un vilain bricolage de IF imbriqués, et je ne suis pas sûr, qui plus est, que le résultat soit plus performant que dans l'explorateur de windows ( Je n'ai pas encore eu l'opportunité de l'essayer dans une grande LAN de 300 personnes... ) Si le "javax.swing.filechooser.FileSystemView" va chercher ce qu'il y a sur le réseau dans l'Explorateur Windows au lieu d'interroger à sa façon l'API de base qui doit servir aussi à ce dernier, le résultat ne sera alors pas intéressant ( NetView.exe est d'ores et déjà, en effet, plus performant que l'Explorateur Windows, pour cela )
Pour ceux que cela intéresse, voici le code de base de l'interface d'un explorateur de fichiers JAVA avec filechooser ( Il doit s'agir de la façon d'implémenter ce dernier qui doit répondre à l'attente originale de ce POST. Manque ce qui concerne les parties à cacher et celles à montrer, si j'ai bien compris... Mais vu le grand âge du POST en question et l'absence de réponse, je crois que ce sera amplement suffisant pour le moment ) Je ne sais plus du tout où j'ai trouvé le code suivant qui n'est pas de moi, mais il est (!Vive!)GNUTELLA, donc  vous pouvez y aller !!!

//**********************************************************************************
import java.awt.*;
import java.io.File;
import java.io.FileFilter;
import java.util.Comparator;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.*;

public class jfilechooser extends JPanel
{
  private static JFrame mf;
  private JTree mTree;
  private DefaultTreeModel mModel;
  private JList mFileView;

  public static void main(String[] args)
  {
    try
    {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception err)
    {
      err.printStackTrace();
    }
    mf=new JFrame("File System Icon Bug");
    mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mf.setBounds(200, 20, 500, 400);
    mf.getContentPane().add(new jfilechooser());
    mf.show();
  }

  jfilechooser()
  {
    super(new BorderLayout());
    File[] roots=FileSystemView.getFileSystemView().getRoots();
    FileRow root=new FileRow(roots);
    mModel=new DefaultTreeModel(root);
    mTree=new JTree(mModel);
    mTree.setEditable(false);
    mTree.setRootVisible(false);
    mTree.setCellRenderer(new FileTreeRenderer());
    mTree.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    JScrollPane scr=new JScrollPane(mTree);
    JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    split.setLeftComponent(scr);

    mFileView=new JList();
    JScrollPane lstScr=new JScrollPane(mFileView);
    split.setRightComponent(lstScr);
    TreeSelectionListener tEar=new TreeSelectionListener()
    {
      public void valueChanged(TreeSelectionEvent e)
      {
        FileRow fr=(FileRow) e.getNewLeadSelectionPath().getLastPathComponent();
        File[] contents=fr.getFile().listFiles();
        mFileView.setListData(contents);
      }
    };
    mTree.addTreeSelectionListener(tEar);
    mFileView.setCellRenderer(new FileListRenderer());
    add(split, BorderLayout.CENTER);
  }

  private static boolean isDirectory(File fl)
  {
    FileSystemView fsv=FileSystemView.getFileSystemView();
    if(fl.isDirectory())
      return fsv.isTraversable(fl).booleanValue();

    return fsv.isComputerNode(fl) || fsv.isDrive(fl) || fsv.isFileSystemRoot(fl);
  }

  private class FileRow
    implements
      FileFilter,
      Comparator,
      TreeNode
  {
    private File mDir;
    private String mName;
    private FileRow[] mChildren;
    private FileRow mParent;

    FileRow(File fl, FileRow parent)
    {
      mDir=fl;
      mName=fl.getName();
      mParent=parent;
      if(mName.length()==0) // file roots have no name
        mName=mDir.toString();
    }

    FileRow(File[] roots)
    {
      mName="Root";
      mChildren=new FileRow[roots.length];
      makeChildren(roots);
    }

    public int getChildCount()
    {
      if(mChildren==null)
        makeChildrenFromDir();
      return mChildren.length;
    }

    public TreeNode getChildAt(int index)
    {
      if(mChildren==null)
        makeChildrenFromDir();
      return mChildren[index];
    }

    private File getFile()
    {
      return mDir;
    }

    /**
     * Workaround to bug 4701462
     */
    private File[] filterFiles(File mDir, FileFilter fltr)
    {
      File[] children=mDir.listFiles();
      List passed=new ArrayList();
      for(int ii=0; ii<children.length; ++ii)
        if(fltr.accept(children[ii]))
          passed.add(children[ii]);
      return (File[]) passed.toArray(new File[0]);
    }

    private void makeChildrenFromDir()
    {
      // We don't call listFiles(FileFilter), due to bug 4701462
//   File[] kids = mDir.listFiles(this);
      File[] kids=filterFiles(mDir, this);
      if(kids!=null)
      {
        Arrays.sort(kids, this);
        mChildren=new FileRow[kids.length];
        makeChildren(kids);
      }
      else // this happens sometimes, like when the volume doesn't exist (a:)
        mChildren=new FileRow[0];
    }

    private void makeChildren(File[] kids)
    {
      for(int ii=0; ii<kids.length; ++ii)
        mChildren[ii]=new FileRow(kids[ii], this);
    }

    public boolean accept(File fl)
    {
      return isDirectory(fl);
    }

    public int compare(Object o1, Object o2)
    {
      return ((File) o1).compareTo((File) o2);
    }

    public String toString()
    {
      return mName;
    }

    public TreeNode getParent()
    {
      return mParent;
    }

    public int getIndex(TreeNode node)
    {
      for(int ii=0; ii<mChildren.length; ++ii)
        if(mChildren[ii]==node)
          return ii;
      return -1;
    }

    public boolean getAllowsChildren()
    {
      return true;
    }

    public boolean isLeaf()
    {
      return false;
    }

    public Enumeration children()
    {
      Enumeration enum=new Enumeration()
      {
        int ii=0;

        public boolean hasMoreElements()
        {
          return ii<mChildren.length;
        }

        public Object nextElement()
        {
          return mChildren[ii++];
        }
      };
      return enum;
    }
  }

  private class FileListRenderer extends DefaultListCellRenderer
  {
    public Component getListCellRendererComponent(
            JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus)
    {
      Component cmp=super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
      Icon sysIcon=FileSystemView.getFileSystemView().getSystemIcon((File) value);
      ((JLabel) cmp).setIcon(sysIcon);
      return cmp;
    }
  }

  private class FileTreeRenderer extends DefaultTreeCellRenderer
  {
    public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                  boolean sel,
                                                  boolean expanded,
                                                  boolean leaf, int row,
                                                  boolean hasFocus)
    {
      File fl=((FileRow) value).getFile();
      String name=FileSystemView.getFileSystemView().getSystemDisplayName(fl);
      Component cmp=super.getTreeCellRendererComponent(tree, name, sel, expanded, leaf, row, hasFocus);
      JLabel jc=(JLabel) cmp;
      Icon fileIcon=FileSystemView.getFileSystemView().getSystemIcon(fl);
      jc.setIcon(fileIcon);
      return jc;
    }
  }
}


vendredi 20 mai 2005 à 16:25:34 | Re : JFileChooser et client/server

desastreux

Au passage, il semblerait que beaucoup de fonctions du genre, présentes en C++ manquent à l'appel avec JAVA... Impossible en effet, avec ce dernier, d'obtenir par exemple le sous-masque réseau ( SubNet Mask ) autrement qu'en passant par "IPCONFIG.EXE"/Windows ou "IFconfig"/ UNIX ou bien en faisant une batterie de tests hyper-gourmands en ressources !!!
Pour un langage connu pour ses facilités réseaux (Sockets), de telles absences font vraiment tâche et quelues recherches sur le NET montrent vite ces limites : Dômmage.
Si je me trompe, ou si la chose évolue dans le bon sens, je vous en pire : Tenez-nous au courant !


1 2

Cette discussion est classé dans : application, server, serveur, client, jfilechooser


Répondre à ce message

Sujets en rapport avec ce message

application client serveur en java [ par florent1 ] Voici mon problème:je dois réaliser une application client serveur en java (avec Jbuilder). Cette appli devra attaquer une base Oracle.Est ce que l'in Developpement d'une socket server et d'une socket client [ par molina ] HelloJe dois developper une socket server et une socket client.le serveur est lui-même connecté à une base de données. Le client se connecte au serveu client serveur avec des threads [ par sparetime ] bonjourje veux réaliser une application serveur entre plusieurs appareils chaque appareil est à la fois client pour émettre des requêtes et serveur po Problème de dessin en client serveur [ par saispasq ] Salut à tous, j'ai une application client serveur en java qui permet à un ensemble de clients de partager un dessin graphique et de dessiner ensemble Application client serveur [ par hhouneida ] Salut,J'ai une application client serveur qui permet aux clients de dessiner ensemble des formes graphiques.Le problème est que seule les clients conn Base de données client serveur [ par Bouchratssi ] salut tout le monde, je developpe une application sous oracle 8i et vb 6.0, la base de données sera installée sur un serveur et tous les clients pourr RTP server [ par byosra ] Bonjour, je suis en train de développer un serveur RTP et j'ai le problème suivant : comment faire pour que le client intialise la session RTP avec le Transfert de fichier via une appli web entre un client et le serveur d'application [ par acoue ] Bonjour à tous, comme indiqué dans le titre,je dois faire un upload entre le disque dur du client et le serveur. Mon idée avait été la suivante : d JFileChooser [ par Skyffer3 ] Bonjour a tous, je voudrais savoir comment transmettre un jfilechooser d'un serveur a un client.Je vous explike, j'aimerais que le client puisse chois [Question] Application client/Serveur utilisant JDBC [ par low_freak ] [Question] Application client/Serveur utilisant JDBC Bonjour à tous, Je recherche de l'information concernant , le passage de flux de donnée du serveu


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.