2012-03-12 23 views
6

Utilizando this question, creé la clase a continuación, que maneja la función de arrastrar y soltar archivos en un JTextField. El objetivo de la aplicación es poder arrastrar un archivo al campo de texto y tener el texto del campo de texto establecido en la ruta del archivo (puede ver el objetivo en el código con bastante claridad).Arrastrar y soltar la ruta del archivo a Java Swing JTextField

Mi problema es que el siguiente código no se compila. El error de compilación indica Cannot refer to non-final variable myPanel inside an inner class defined in a different method. No he trabajado mucho con las clases internas, así que ¿puede Seomeone mostrarme cómo resolver el error y lograr que el código se comporte como se diseñó?

Código:

import java.awt.datatransfer.DataFlavor; 
import java.awt.dnd.DnDConstants; 
import java.awt.dnd.DropTarget; 
import java.awt.dnd.DropTargetDropEvent; 
import java.io.File; 
import java.util.List; 

import javax.swing.*; 

public class Test { 

public static void main(String[] args) { 
    JTextArea myPanel = new JTextArea(); 

    myPanel.setDropTarget(new DropTarget() { 
     public synchronized void drop(DropTargetDropEvent evt) { 
      try { 
       evt.acceptDrop(DnDConstants.ACTION_COPY); 
       List<File> droppedFiles = (List<File>) evt 
         .getTransferable().getTransferData(
           DataFlavor.javaFileListFlavor); 
       for (File file : droppedFiles) { 
        /* 
        * NOTE: 
        * When I change this to a println, 
        * it prints the correct path 
        */ 
        myPanel.setText(file.getAbsolutePath()); 
       } 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    }); 

    JFrame frame = new JFrame(); 
    frame.add(myPanel); 
    frame.setVisible(true); 

} 

} 

Respuesta

5

Como dice el mensaje de error, myPanel necesita ser definida como definitiva.

final JTextArea myPanel = new JTextArea(); 

De esta manera la clase interna se puede dar un puntero referencia a la instancia variable sin la preocupación de que la variable puede ser cambiado para que apunte a algo más tarde durante la ejecución.

+0

Gracias! eso lo solucionó ¿Todavía podré alterar las propiedades del campo de texto (cambiar el texto dentro, por ejemplo) si se declara final? – ewok

+1

@ewok: Sí. Lo único que 'final' le hace a una variable es asegurarse de no asignarle otro valor/referencia después de que se haya inicializado. – unholysampler

0

Otra opción es declarar la variable estática.

 

    static JTextArea myPanel = new JTextArea(); 

Cuestiones relacionadas