2011-08-27 22 views
5

Estoy usando un JFileChooser como el editor de una celda JTable. Me gustaría que el usuario seleccione un archivo válido usando JFileChooser, luego cuando presionen enter, la ruta del archivo se guarda en la celda. Esto presenta un problema si quieren borrar la celda. Así que quiero que eliminen JFileChooser y que configuren la celda con la cadena vacía (o nula, cualquiera que sea).JFileChooser elija el archivo vacío

Mi problema es que si no ha seleccionado un archivo, no puede presionar el botón Aprobar. En mi código, "¡vacío!" nunca se imprime ¿Hay alguna manera de hacerlo? ¿Permitir que el botón Aprobar se seleccione cuando no se selecciona ningún archivo? Esto es lo que he intentado:

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

¿No imprimirá "vacío"? si presiona Cancelar en JFileChooser? –

+0

No es así. No estoy seguro del funcionamiento interno de JFileChooser, pero supongo que nunca intenta aprobarSelection si el usuario cancela. – Andrea

Respuesta

4

puede estar interesado en sobreescribir el método JFileChooser cancelSelection() que se invoca cuando el usuario cancela la elección del archivo.

tal vez no es intuitivo y fácil de usar para hacer JTable de celda con JFileChooser selección de un nombre de archivo vacío. Es mejor tener un pequeño botón junto a la celda JTable, de modo que borre el valor de la celda si el usuario hace clic en ella o cualquier otra opción para restablecer el valor de la celda y solo utiliza JFileChooser para cambiar la ruta del archivo en la celda.

+0

también había pensado en el botón de reinicio. Quiero dejar el botón Cancelar en su lugar en caso de que el usuario quiera cancelar. Aunque creo que se puede hacer con el botón de salida en la parte superior ... – Andrea

+2

+1 para la idea de tener un botón separado que borre la celda. Elegir cancelar realmente debería revertir la celda al estado en que se encontraba antes de que se abriera el JFileChooser. –

0

Me pregunto si se puede escribir una clase que se extiende JFileChooser, y modificar el campo de texto de manera que la limpieza no se deshabilita el botón Aceptar.

+0

técnicamente, el botón Aceptar está habilitado, simplemente no sucede nada cuando hago clic en él. Pero el concepto debería funcionar – Andrea

+0

No creo que esta solución sea factible para ningún archivo seleccionado.No está realmente en la clase JFileChooser donde está manejando e ignorando el clic del botón. –

1

Cuando ejecuta el código que ha proporcionado, ni siquiera está entrando en el controlador approveSelection si no se ha seleccionado ningún archivo. Internamente, hay un código para evitar una selección nula. Este comportamiento proviene del método ApproveSelectionAction de BasicFileChooserUI que tiene una comprobación de que si el nombre de archivo es nulo, vuelve sin llamar a approveSelection en el selector, por lo que JFileChooser nunca recibe una notificación de que se haya presionado "Aceptar". Esta es una función muy larga y fea, por lo que incluso si encontraras una forma de acceder a ella, sería complicado cambiar el comportamiento.

Varias rutas posibles de trabajar alrededor de este:

1) Se puede incrustar el JFileChooser en otro componente y mostrar el componente principal lugar. Luego, debe agregar el JFileChooser y su botón personalizado al mismo panel y agregar el manejo de botones para el botón personalizado. El botón personalizado podría manejar al usuario que desea seleccionar nada. Esta publicación puede dar algunas sugerencias: JFileChooser embedded in a JPanel

2) Puede abusar de la función "accesorio" de JFileChooser. Normalmente está "destinado" a mostrar una vista previa del tipo de archivo, pero dado que toma un componente arbitrario por lo que no hay ninguna razón por la que no pueda agregar su propio botón "No File" y configure un oyente, y cierre el diálogo si se presiona ese botón y envía la notificación a su celda de la tabla que debe ser un valor en blanco. Relativamente fácil.

3) puede intentar hackear el cuadro de diálogo JFileChooser para agregar un botón adicional al lado de Guardar y Cancelar. Probablemente esto no sea muy fácil, y probablemente tenga que hacer algo complicado para encontrar el botón Cancelar y agregar otro botón a su padre. Probablemente solo sea factible si eres un experto en Java.

4) puede crear algún tipo de archivo "falso"/especial, que si se selecciona, hace una excepción al manejo normal y muestra un nombre de archivo en blanco en lugar del nombre real.

+0

gracias por el análisis exhaustivo. al menos ahora entiendo por qué al hacer clic en el botón aprobar no hice nada. – Andrea

+0

@Andrea Por un problema muy similar (que permite al usuario borrar la opción de archivo) Recientemente, heckeé la versión _Windows_ LAF de JFileChooser para agregar un tercer botón. Si estás interesado, podría enviarte el código. _Windows only_, aunque es posible que puedas hacer trucos similares para Mac, etc ... – user949300

Cuestiones relacionadas