将文件路径拖放到Java Swing JTextField中

7
使用这个问题,我创建了下面的类,用于处理将文件拖放到JTextField中。该应用程序的目的是能够将文件拖入文本字段,并将文本字段的文本设置为文件路径(您可以在代码中清楚地看到目标)。
我的问题是以下代码无法编译。编译错误显示“无法引用不在同一方法中定义的非最终变量myPanel的内部类”。由于我没有使用过内部类,所以有人能向我展示如何解决错误并使代码按设计行为吗?
代码:
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);

}

}
2个回答

5
正如错误信息所述,myPanel需要被定义为final。
final JTextArea myPanel = new JTextArea();

通过这种方式,内部类可以被赋予一个对变量实例的引用指针,而不必担心在执行过程中变量可能会被改变并指向其他内容。


谢谢!问题已解决。如果一个文本字段被声明为final,我还能更改它的属性吗?例如更改其中的文本内容。 - ewok
1
@ewok:是的。final 对变量唯一的作用就是确保在初始化之后,你不能再给它赋值或者引用其他值。 - unholysampler

0

另一种选择是声明变量为静态。

    static JTextArea myPanel = new JTextArea();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接