2012-03-12 73 views
6

使用this question,我創建了下面的類,它處理將文件拖放到JTextField的類。應用程序的要點是能夠將文件拖入文本字段,並將文本字段的文本設置爲文件路徑(您可以非常清楚地看到代碼中的目標)。將文件路徑拖放到Java Swing JTextField

我的問題是下面的代碼不能編譯。編譯錯誤狀態爲Cannot refer to non-final variable myPanel inside an inner class defined in a different method。我對內部類沒有太多的工作,所以seomeone能告訴我如何解決錯誤並讓代碼按照設計行事?

代碼:

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

} 

} 

回答

5

作爲錯誤消息指出,myPanel需要被定義爲最終。

final JTextArea myPanel = new JTextArea(); 

這樣的內部類可以給出一個參考指針變量實例而不用擔心變量可能被改變以後執行期間指向別的東西。

+0

謝謝!修復它。如果聲明爲最終的,我仍然能夠更改文本字段的屬性(例如,更改內部的文本)嗎? – ewok 2012-03-12 15:37:12

+1

@ewok:是的。 'final'對變量唯一的作用是確保在初始化後不會爲其指定另一個值/引用。 – unholysampler 2012-03-12 15:58:46

0

另一種選擇是聲明變量static。

 

    static JTextArea myPanel = new JTextArea();