Utilizzando this question, ho creato la classe seguente, che gestisce il trascinamento di file in un campo JTextField. Il punto dell'applicazione è essere in grado di trascinare un file nel campo di testo e impostare il testo del campo di testo sul percorso del file (è possibile vedere chiaramente l'obiettivo nel codice).Trascinare il percorso del file su Java Swing JTextField
Il mio problema è il seguente codice non viene compilato. L'errore di compilazione indica Cannot refer to non-final variable myPanel inside an inner class defined in a different method
. Non ho lavorato molto con le classi interne, quindi qualcuno può mostrarmi come risolvere l'errore e far sì che il codice si comporti come progettato?
Codice:
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);
}
}
Grazie! quello lo ha riparato. Potrò ancora alterare le proprietà del campo di testo (per esempio, cambiare il testo all'interno, se è dichiarato definitivo? – ewok
@ewok: Sì. L'unica cosa 'finale' fa a una variabile è assicurarsi di non assegnare un altro valore/riferimento ad esso dopo che è stato inizializzato. – unholysampler