4 Stimmen

TXT-Datei in TextArea ziehen und ablegen

Hier habe ich einen Textbereich namens sourceTx, in den ich Dateien ziehe und ablege, dann lese ich den Inhalt dieser Datei mit BufferedReader. Wie Sie aus dem untenstehenden Code sehen können, habe ich die Datei, aus der ich den Inhalt lese, mit absolutepath angegeben.

Wenn ich also eine .txt-Datei ziehe und ablege, funktioniert es, der Inhalt wird gelesen und in den Textbereich eingefügt, aber wenn ich zum Beispiel einen Ordner ziehe und ablege, wird auch der Inhalt gelesen und in den Textbereich eingefügt.

Ich möchte diese Drag & Drop-Funktion also so einstellen, dass sie nur .txt-Dateien liest? Wie kann ich das erreichen?

Hier ist der Code für diese Methode:

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

1voto

worcin Punkte 129

Hallo, versuchen Sie, Ihre Datei mit Rekursion zu lesen

...
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;
        }

0voto

Vineet Kosaraju Punkte 5342

Ich habe online eine gute Quelle für die Verwendung von Drag & Drop gefunden. Hier sind einige Klassen / Dinge, die Sie vielleicht untersuchen möchten:

java.awt.dnd.*

Ich habe das praktisch aus einem Online-Tutorial kopiert, aber hier ist etwas Code (nicht meiner, aber getestet und es funktioniert):

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
}

Nun zum 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);
            }
        }
    }

}

Sie können dies verwenden, um einen JFrame zu erstellen, um die Dateien zu ziehen und abzulegen, und dann zu prüfen, ob der Dateiname ".txt" enthält (ich bin nicht sicher, ob Java Methoden hat, um den Dateityp zu bestimmen, auch wenn er keine Erweiterungen hat). Wenn sie ".txt" enthält, können Sie sie im Textbereich öffnen.

Wenn mir jemand helfen kann, das Original-Tutorial/die Original-Website zu finden, wäre ich sehr dankbar. Auch sorry für die Formatierung der Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X