将文件路径拖放到 Java Swing JTextField

Posted

技术标签:

【中文标题】将文件路径拖放到 Java Swing JTextField【英文标题】:Drag and Drop file path to Java Swing JTextField 【发布时间】:2012-03-28 23:56:51 【问题描述】:

使用this question,我创建了下面的类,它处理将文件拖放到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);




【问题讨论】:

【参考方案1】:

正如错误消息所说,myPanel 需要定义为 final。

final JTextArea myPanel = new JTextArea();

这样可以给内部类一个指向变量实例的引用指针,而不用担心变量可能会在稍后的执行过程中被更改为指向其他东西。

【讨论】:

谢谢!解决了它。如果它被声明为 final,我是否仍然可以更改文本字段的属性(例如更改里面的文本)? @ewok:是的。 final 对变量所做的唯一事情是确保在初始化后不要为其分配另一个值/引用。【参考方案2】:

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

静态 JTextArea myPanel = new JTextArea();

【讨论】:

以上是关于将文件路径拖放到 Java Swing JTextField的主要内容,如果未能解决你的问题,请参考以下文章

从 Java Swing 应用程序拖放到 Windows 资源管理器

Swing 应用程序 -> 拖放到桌面/文件夹

自定义对象从 FX 拖放到 Swing

java中JFrame按钮添加事件,选择路径放到文本框里面

如何从 Swing 应用程序拖放到 Windows 资源管理器?

如何将外部文件拖放到我的 xojo 应用程序并返回路径