2011-08-27 5 views
5

J'utilise un JFileChooser comme éditeur pour une cellule JTable. Je voudrais que l'utilisateur sélectionne un fichier valide en utilisant JFileChooser, puis quand il appuie sur Entrée, le chemin du fichier est sauvegardé dans la cellule. Cela présente un problème s'ils veulent effacer la cellule. Donc je veux qu'ils effacent le JFileChooser et cela va mettre la cellule avec la chaîne vide (ou null, selon le cas).JFileChooser choisir le fichier vide

Mon problème est que si vous n'avez pas sélectionné un fichier, vous ne pouvez pas appuyer sur le bouton Approuver. Dans mon code, "vide!" n'est jamais imprimé. Y at-il un moyen de permettre le bouton d'approbation sélectionné lorsque aucun fichier n'est sélectionné? Voici ce que j'ai essayé:

JFileChooser component = new JFileChooser(){ 
     public void approveSelection(){ 
      File f = getSelectedFile(); 
      if(f==null){ 
       System.out.println("empty!"); 
       return; 
      }else{ 
       if(!f.exists()){ 
        System.out.println("does not exist!"); 
       }else{ 
        super.approveSelection(); 
       } 

      } 
     } 
    }; 
+0

Est-ce que ça ne va pas "vide!" si vous appuyez sur Annuler dans le JFileChooser? –

+0

Ce n'est pas le cas. Je ne suis pas sûr du fonctionnement interne de JFileChooser, mais je suppose qu'il n'essaie jamais d'approuver la sélection si l'utilisateur annule. – Andrea

Répondre

4

vous pouvez être intéressé par surenchérir JFileChooser cancelSelection() méthode qui est appelée lorsque l'utilisateur annule le choix de fichier.

peut-être que ce n'est pas intuitif et facile à utiliser pour faire la suppression des cellules JTable avec la sélection JFileChooser d'un nom de fichier vide. Il vaut mieux avoir un petit bouton à côté de la cellule JTable pour effacer la valeur de la cellule si l'utilisateur clique dessus ou toute autre option pour réinitialiser la valeur de la cellule et utiliser JFileChooser uniquement pour changer de chemin dans la cellule.

+0

J'avais aussi pensé au bouton de réinitialisation. Je veux laisser le bouton d'annulation en place au cas où l'utilisateur souhaite annuler. Bien que je suppose que cela peut être fait avec le bouton de sortie en haut ... – Andrea

+2

+1 pour l'idée d'avoir un bouton séparé qui efface la cellule. Le choix d'annuler devrait simplement ramener la cellule à l'état dans lequel elle se trouvait avant l'ouverture de JFileChooser. –

0

Je me demande si vous pouvez écrire une classe qui étend JFileChooser et modifier le champ de texte afin que la compensation ne désactive pas le bouton Accepter.

+0

techniquement, le bouton Accepter est activé, rien ne se passe quand je clique dessus. Mais le concept devrait fonctionner – Andrea

+0

Je ne pense pas que cette solution serait faisable pour aucun fichier sélectionné.Ce n'est pas réellement dans la classe JFileChooser où il gère et ignore le clic sur le bouton. –

1

Lorsque vous exécutez le code que vous avez fourni, il n'est même pas entré dans le gestionnaire approveSelection si aucun fichier n'est sélectionné. En interne, il y a du code pour empêcher une sélection nulle. Ce comportement vient de la méthode ApproveSelectionAction de BasicFileChooserUI qui vérifie que si le nom de fichier est null, il renvoie sans appeler approveSelection sur le sélecteur, de sorte que JFileChooser ne reçoit jamais de notification indiquant que "Accept" a été pressé. C'est une fonction vraiment très longue, donc même si vous avez trouvé un moyen d'y accéder, il serait difficile de changer le comportement.

Plusieurs itinéraires possibles de contourner cela:

1) Vous pouvez intégrer le JFileChooser dans un autre composant et afficher le composant parent à la place. Ensuite, vous ajouteriez à la fois le JFileChooser et votre bouton personnalisé au même panneau et ajouteriez la gestion des boutons pour le bouton personnalisé. Le bouton personnalisé peut gérer l'utilisateur souhaitant ne rien sélectionner. Ce post peut donner quelques indications: JFileChooser embedded in a JPanel

2) Vous pourriez abuser de la fonction «accessoire» du JFileChooser. Normalement, il est "prévu" d'afficher un aperçu du type de fichier, mais comme il prend un composant arbitraire, il n'y a aucune raison de ne pas y ajouter votre propre bouton "No File" et de définir un écouteur. Si ce bouton est enfoncé, envoyez la notification à la cellule de votre tableau pour indiquer qu'elle doit être vide. Relativement facile. 3) vous pouvez essayer de pirater la boîte de dialogue JFileChooser pour ajouter un bouton supplémentaire à côté de Enregistrer et Annuler. Ce n'est probablement pas très facile, et vous devrez probablement faire quelque chose de difficile pour trouver le bouton Annuler et ajouter un autre bouton à son parent. Probablement seulement faisable si vous êtes un expert de Java. 4) vous pouvez créer une sorte de fichier "faux"/spécial, qui, s'il est sélectionné, fait une exception à la gestion normale et affiche un nom de fichier vide au lieu du vrai nom de fichier.

+0

merci pour l'analyse complète. au moins je comprends maintenant pourquoi cliquer sur le bouton d'approbation n'a rien fait. – Andrea

+0

@Andrea Pour un problème très similaire (permettant à l'utilisateur d'effacer le choix du fichier) J'ai récemment piraté la version _Windows_FAL de JFileChooser pour ajouter un troisième bouton. Si vous êtes intéressé, je pourrais vous envoyer le code. _Windows only_, même si vous pourriez être en mesure de faire des trucs similaires pour Mac etc ... – user949300