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ď č. 1Ako 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 ();