/ / Cesta súbormi drag and drop do Java Swing JTextField - java, swing, drag-and-drop

Drag and Drop cesta k súboru Java Swing JTextField - java, swing, drag-and-drop

Použitím táto otázka, Vytvoril som triedu nižšie, ktorá zvláda ťahaniea kvapka súborov na JTextField. Účelom aplikácie je umožniť presunutie súboru do textového poľa a nastavenie textu textového poľa na cestu k súboru (cieľ môžete v kóde vidieť celkom jasne).

Môj problém je, že sa nižšie uvedený kód nezkompiluje. Chybové stavy kompilácie Cannot refer to non-final variable myPanel inside an inner class defined in a different method, S vnútornými triedami som veľa nespolupracoval, takže mi môže niekto ukázať, ako chybu vyriešiť a prinútiť kód správať sa tak, ako bol navrhnutý?

kód:

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

}

}

odpovede:

5 pre odpoveď č. 1

Ako hovorí chybové hlásenie, myPanel musí byť definovaný ako konečný.

final JTextArea myPanel = new JTextArea();

Týmto spôsobom môže byť vnútornej triede pridelený jeden referenčný ukazovateľ na inštanciu premennej bez obáv, že by sa premenná mohla zmeniť tak, aby ukazovala na niečo iné neskôr počas vykonávania.


0 pre odpoveď č. 2

Ďalšou možnosťou je deklarovať premennú statickú.


static JTextArea myPanel = new JTextArea ();