/ / Drag & Drop-Dateipfad zu Java Swing JTextField - Java, Swing, Drag & Drop

Drag & Drop-Dateipfad zu Java Swing JTextField - Java, Swing, Drag & Drop

Verwenden diese FrageIch habe die folgende Klasse erstellt, die Drag & Drop behandeltund Ablegen von Dateien in ein JTextField. Ziel der Anwendung ist es, eine Datei in das Textfeld zu ziehen und den Text des Textfelds auf den Pfad der Datei zu setzen (Sie können das Ziel im Code ziemlich deutlich sehen).

Mein Problem ist, dass der folgende Code nicht kompiliert wird. Der Kompilierungsfehler lautet Cannot refer to non-final variable myPanel inside an inner class defined in a different method. Ich habe nicht viel mit inneren Klassen gearbeitet, kann mir also jemand zeigen, wie man den Fehler behebt und den Code dazu bringt, sich wie vorgesehen zu verhalten?

Code:

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

}

}

Antworten:

5 für die Antwort № 1

Wie die Fehlermeldung sagt, myPanel muss als endgültig definiert werden.

final JTextArea myPanel = new JTextArea();

Auf diese Weise kann der inneren Klasse ein Referenzzeiger auf die Variableninstanz zugewiesen werden, ohne dass befürchtet wird, dass die Variable später während der Ausführung so geändert wird, dass sie auf etwas anderes verweist.


0 für die Antwort № 2

Eine andere Möglichkeit ist, die Variable static zu deklarieren.


statisches JTextArea myPanel = neues JTextArea ();