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);
}
}
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
@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