2012-03-12 39 views
6

Sử dụng this question, tôi đã tạo lớp bên dưới, xử lý kéo và thả tệp vào JTextField. Điểm của ứng dụng là để có thể kéo một tệp vào trường văn bản và có văn bản của trường văn bản được đặt thành đường dẫn của tệp (bạn có thể thấy mục tiêu trong mã khá rõ ràng).Kéo và thả đường dẫn tệp đến Java Swing JTextField

Vấn đề của tôi là mã bên dưới không biên dịch. Lỗi biên dịch nêu rõ Cannot refer to non-final variable myPanel inside an inner class defined in a different method. Tôi đã không làm việc nhiều với các lớp bên trong, do đó, seomeone có thể chỉ cho tôi cách giải quyết lỗi và nhận mã để hoạt động như được thiết kế?

Code:

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

} 

} 

Trả lời

5

Như thông báo lỗi nói, myPanel cần phải được định nghĩa là chính thức.

final JTextArea myPanel = new JTextArea(); 

Bằng cách này, lớp bên trong có thể được đưa ra một con trỏ tham chiếu đến biến thể mà không lo ngại biến có thể được thay đổi để trỏ đến một thứ khác sau này trong quá trình thực thi.

+0

Cảm ơn! đã sửa nó. Tôi vẫn sẽ có thể thay đổi các thuộc tính của trường văn bản (thay đổi văn bản bên trong, ví dụ) nếu nó được khai báo cuối cùng? – ewok

+1

@ewok: Có. Điều duy nhất 'final' làm cho một biến là đảm bảo rằng bạn không gán giá trị/tham chiếu khác cho nó sau khi nó được khởi tạo. – unholysampler

0

Một tùy chọn khác là khai báo biến tĩnh.

 

    static JTextArea myPanel = new JTextArea(); 

Các vấn đề liên quan