2012-03-12 14 views
6

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

} 

} 

risposta

5

Come dice il messaggio di errore, myPanel ha bisogno di essere definito come finale.

final JTextArea myPanel = new JTextArea(); 

questo modo la classe interna può essere dato un puntatore riferimento all'istanza variabile senza preoccupazione che la variabile potrebbe essere modificato per puntare a qualcos'altro tardi durante l'esecuzione.

+0

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

+1

@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

0

Un'altra opzione è dichiarare la variabile statica.

 

    static JTextArea myPanel = new JTextArea(); 

Problemi correlati