2012-03-12 39 views
6

this questionを使用して、JTextFieldへのファイルのドラッグアンドドロップを処理する以下のクラスを作成しました。アプリケーションのポイントは、ファイルをテキストフィールドにドラッグして、テキストフィールドのテキストをファイルのパスに設定できるようにすることです(コード内の目標をはっきりと見ることができます)。JavaへのファイルのドラッグアンドドロップSwing JTextField

私の問題は以下のコードがコンパイルされないことです。コンパイルエラーの内容はCannot refer to non-final variable myPanel inside an inner class defined in a different methodです。私は内部クラスではあまり働いていないので、エラーを解決してコードが設計どおりに動作するようにする方法を私に見せてもらえますか?

コード:エラーメッセージとして

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

はfinalとして定義する必要がmyPanel、と言います。

final JTextArea myPanel = new JTextArea(); 

内部クラスは、変数が後で実行時に何か他のものを指すように変更されるかもしれないという懸念せずに変数インスタンスへの一つの基準ポインタを与えることができるこの方法です。

+0

ありがとうございます!それを固定した最終的に宣言されている場合でも、テキストフィールドのプロパティを変更することはできますか(たとえば、内部のテキストを変更しますか?) – ewok

+1

@ewok:はい。 'final'が変数に対して行うのは、初期化された後で別の値/参照を割り当てないことだけです。 – unholysampler

0

もう1つの方法は、変数staticを宣言することです。

 

    static JTextArea myPanel = new JTextArea();