【问题标题】:Drag and drop TXT file into TextArea将 TXT 文件拖放到 TextArea
【发布时间】:2012-04-14 14:37:53
【问题描述】:

这里有一个名为 sourceTx 的文本区域,我在其中拖放文件,然后使用 BufferedReader 读取该文件的内容。正如您从下面的代码中看到的那样,我设置了使用绝对路径读取内容的文件。

所以,当我拖放一些 .txt 文件时,它会读取内容并将其放入文本区域,但是当我也拖放一些文件夹时,它也会读取一些内容并将其放入文本区域。

所以我想将此拖放设置为只读 .txt 文件?我怎样才能得到它?

这是该方法的代码:

  public void dragDrop(){

       sourceTx.setOnDragOver(new EventHandler <DragEvent>()  {
        @Override
        public void handle(DragEvent event) {

            Dragboard db = event.getDragboard();

            if(db.hasFiles()){
                event.acceptTransferModes(TransferMode.ANY);

                for(File file:db.getFiles()){
                    String absolutePath = file.getAbsolutePath();
                    BufferedReader br = null;
                    try {
                        br = new BufferedReader(new InputStreamReader(new FileInputStream(absolutePath)));

                        String line = null;
                        String text = "";

                        String nl = System.getProperty("line.separator", "\n");

                        while((line = br.readLine()) != null)
                            text += line + nl;

                        sourceTx.setText( text.trim() );

                    } catch (Exception e) {
                        MessageBox.show(MessageBoxType.ERROR, I18n.localize("File Error"), I18n.localize("Error while reading content from selected file"));
                    } finally{
                        if(br != null)
                            try {
                                br.close();
                            } catch (Exception e) {}
                    }

                }

            }else{
                event.setDropCompleted(false);
            }

            event.consume();
        }
    });
}

【问题讨论】:

  • 可以过滤文件路径名。
  • 感谢您的评论,但有没有类似的例子或类似的东西?
  • 嗯,你可以找很多例子,但它只是一个简单的过滤器,比如if (file.getAbsolutePath().toLowerCase().contains(".tif")) //proceed...
  • 谢谢,我会尝试类似的。
  • 是的,实际上@eee 所说的是最简单的方法。

标签: java drag-and-drop javafx javafx-2


【解决方案1】:

您好,尝试使用递归读取您的文件

...
for (File file : db.getFiles()) {
    sourceTx.setText(handleFile(file));
}
...
    private String handleFile(File file) {
            String ret = "";
            if (file.isDirectory()) {
                for (File f : file.listFiles()) {
                    ret.concat(handleFile(f));
                }
            } else {
                /*this is your filereader*/
                String absolutePath = file.getAbsolutePath();
                BufferedReader br = null;
                try {
                    br = new BufferedReader(new InputStreamReader(new FileInputStream(absolutePath)));

                    String line = null;
                    String text = "";

                    String nl = System.getProperty("line.separator", "\n");

                    while ((line = br.readLine()) != null)
                        text += line + nl;

                    ret.concat(text.trim());

                } catch (Exception e) {
                    MessageBox.show(MessageBoxType.ERROR, I18n.localize("File Error"), I18n.localize("Error while reading content from selected file"));
                } finally {
                    if (br != null)
                        try {
                            br.close();
                        } catch (Exception e) {
                        }
                }

            }
            return ret;
        }

【讨论】:

    【解决方案2】:

    我在网上找到了一个关于使用拖放的好资源。 以下是您可能想要调查的一些课程/事情:

    java.awt.dnd.*
    

    我实际上是从在线教程中复制的,但这里有一些代码(不是我的,但经过测试并且有效):

    public class MyFrame extends JFrame
    {
        // insert other code here
        JLabel myLabel = new JLabel("My stuff here");
        // Create the drag and drop listener
        MyDragDropListener myDragDropListener = new MyDragDropListener(this);
    
        // Connect the label with a drag and drop listener
        new DropTarget(myLabel, myDragDropListener);
    
        // then just add the label
        // also have a method something like "get" which will be used so that the listener can send
        // the list of files dropped here, and you can process it here
    }
    

    现在是 MyDragDropListener。

    import java.awt.dnd.*;
    import java.awt.datatransfer.*;
    import java.io.File;
    import java.util.List;
    public class MyDragDropListener implements DropTargetListener
    {
        MyFrame frame; // initialize in a constructor that takes in the frame
    
        @Override
        public void dragEnter(DropTargetDragEvent event) {
        }
    
        @Override
        public void dragExit(DropTargetEvent event) {
        }
    
        @Override
        public void dragOver(DropTargetDragEvent event) {
        }
    
        @Override
        public void dropActionChanged(DropTargetDragEvent event) {
        }
    
        @Override
        public void drop(DropTargetDropEvent event)
        {
            // This is the main chunk of the drag and drop.
            event.acceptDrop(DnDConstants.ACTION_COPY);
            Transferable transferable = event.getTransferable();
            DataFlavor[] flavors = transferable.getTransferDataFlavors();
            for(DataFlavor flavor : flavors)
            {
                if(flavor.isFlavorJavaFileListType())
                {
                    List myFiles = (List) transferable.getTransferData(flavor);
                    frame.get(myFiles);
                }
            }
        }
    
    }
    

    您可以使用它创建一个JFrame来拖放文件,然后检查文件名是否包含“.txt”(我不确定Java是否有确定文件类型的方法,即使它没有扩展名。 ) 如果它包含“.txt”,那么您可以在 TextArea 中打开它。

    如果有人能帮我找到原始教程/网站,我将不胜感激。也很抱歉答案的格式。

    【讨论】:

    • 使用拖放添加指向该优质资源的在线链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多