2010-11-12 7 views

Répondre

2

Ceci est une extension à une solution publiée à http://www.mikepot.com/1493.html. La différence est que les simples clics sont convertis en double-clics. Cela semble fonctionner mieux sous Ubuntu où les doubles clics semblent être traduits en un seul clic.

package com.troyware.inventoryItemManager; 

import java.awt.Component; 
import java.awt.Container; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JList; 

/** 
* This file chooser prevents users from changing file names and thus should facilitate navigating to the correct file 
* by precluding the user from getting stuck when single clicking a folder name 
* 
* @author http://www.mikepot.com/1493.html 
* slightly modified by Phil Troy, www.PhilTroy.com, to convert single click into double click 
*/ 
public class MyFileChooser extends JFileChooser 
{ 

    public MyFileChooser() 
     { JList list = findFileList(this); 
      for (MouseListener l : list.getMouseListeners()) 
      { if (l.getClass().getName().indexOf("FilePane") >= 0) 
       { list.removeMouseListener(l); 
        list.addMouseListener(new MyMouseListener(l)); 
       } 
      } 
     } 

     private JList findFileList(Component comp) 
     { if (comp instanceof JList) return (JList)comp; 
      if (comp instanceof Container) 
      { for (Component child : ((Container)comp).getComponents()) 
       { JList list = findFileList(child); 
        if (list != null) return list; 
       } 
      } 
      return null; 
     } 

     private class MyMouseListener extends MouseAdapter 
     { 
     MyMouseListener(MouseListener listenerChain) 
     { m_listenerChain = listenerChain; 
     } 


     public void mouseClicked(MouseEvent event) 
     { if (event.getClickCount() > 0) 
      { m_listenerChain.mouseClicked(new MouseEvent(event.getComponent(), event.getID(), event.getWhen(), event.getModifiers(), event.getX(), event.getY(), 2, false)); 
      } 
     } 

     private MouseListener m_listenerChain; 
     } 

    private static final long serialVersionUID = 1L; 
} 
7

Je pense que ce que vous voulez vraiment, c'est que l'utilisateur sélectionne un fichier existant.

Vous écrivez un programme d'écoute d'action pour que JFileChooser vérifie et s'assure que le fichier existe.

Vous voulez toujours l'utilisateur d'être en mesure de taper dans le champ de saisie de fichier afin qu'il puisse limiter ce qui est affiché dans le JFileChooser,

Par exemple, si les types d'utilisateurs *.txt, seuls .txt fichiers sont affichés. Si l'utilisateur tape one*, seuls les fichiers commençant par les lettres o-n-e sont affichés.

6

Entièrement d'accord avec Gilbert. Mais dans le cas contraire, si vous voulez réellement ce que vous avez demandé: Ce champ de texte défini à l'intérieur de l'implémentation de plaf, et vous pouvez utiliser, disons réflexion, l'obtenir et le changer, ou vous pouvez essayer d'itérer des composants enfants espérant que le seul JTextArea est celui que vous cherchez. L'exemple suivant utilise la réflexion et fonctionne pour un look métallique et la sensation:

 
import java.awt.Frame; 
import java.lang.reflect.Field; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.plaf.metal.MetalFileChooserUI;

public class FileChooser {

public static void main(String[] args) throws Exception{ Frame f = new JFrame(); JFileChooser jFileChooser = new JFileChooser(); MetalFileChooserUI ui = (MetalFileChooserUI)jFileChooser.getUI(); Field field = MetalFileChooserUI.class.getDeclaredField("fileNameTextField"); field.setAccessible(true); JTextField tf = (JTextField) field.get(ui); tf.setEditable(false); tf.setEnabled(false); jFileChooser.showDialog(f, "Select"); f.dispose(); }

}

+0

Brillant! C'est exactement ce que je voulais faire (j'ai cette option appelée "exporter tout", qui correspond aux éléments sur une liste, donc ils ont déjà leurs noms, et je veux juste sélectionner le dossier). –

3

Vous pouvez passer par la hiérarchie des enfants des composants (comme Yuriy mentionné). Voici la fonction pour trouver JTextField dans la hiérarchie des composants. Il trouve 1st JTextField (en espérant que le champ de texte nécessaire est le seul dans FileChooser).

{ 
    JFileChooser fc = new JFileChooser(); 
    disableTF(fc); 
} 

public boolean disableTF(Container c) { 
    Component[] cmps = c.getComponents(); 
    for (Component cmp : cmps) { 
     if (cmp instanceof JTextField) { 
      ((JTextField)cmp).setEnabled(false); 
      return true; 
     } 
     if (cmp instanceof Container) { 
      if(disableTF((Container) cmp)) return true; 
     } 
    } 
    return false; 
} 
Questions connexes