簡體   English   中英

將文本文件拖放到Java Applet上

[英]Dragging and Dropping a text file onto Java Applet

我正在開發一個桌面應用程序,其中需要將文本文件拖放到JAVA applet上,並且該applet應該能夠自動檢測文件的絕對路徑並且應該能夠執行某些操作。 (就我而言,在服務器上上傳)

我在接受作為JTextArea的applet上的文件時遇到問題。

任何幫助以及代碼和解釋將很有幫助。

提前致謝

以下是用於刪除文件並顯示其路徑的代碼。 但是問題是小程序僅從文件資源管理器接受文件,而不能直接從桌面或任何其他窗口接受文件。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class Main extends JFrame implements DropTargetListener {
  DropTarget dt;
  JTextArea ta = new JTextArea();
  public Main() {
    super("Drop Test");
    setSize(300, 300 );
    getContentPane()
        .add(new JLabel("Drop something here:"), BorderLayout.NORTH);

    ta.setBackground(Color.white);
    getContentPane().add(ta, BorderLayout.CENTER);
    dt = new DropTarget(ta, this);
    setVisible(true);
  }

 public void dragEnter(DropTargetDragEvent dtde) {
   // System.out.println("Drag Enter");
  }

  public void dragExit(DropTargetEvent dte) {
    //System.out.println("Drag Exit");
  }

  public void dragOver(DropTargetDragEvent dtde) {
    //System.out.println("Drag Over");
  }

  public void dropActionChanged(DropTargetDragEvent dtde) {
    System.out.println("Drop Action Changed");
  }

  public void drop(DropTargetDropEvent dtde) {
    try {
        System.out.println("in drop");
      Transferable tr = dtde.getTransferable();

      DataFlavor[] flavors = tr.getTransferDataFlavors();
      System.out.println(flavors.length);
      for (int i = 0; i < flavors.length; i++) {
        if (flavors[i].isFlavorJavaFileListType()) {
            System.out.println("In if");
          dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
          List list = (List) tr.getTransferData(flavors[i]);
          for (int j = 0; j < list.size(); j++) {
            ta.append(list.get(j) + "\n");
          }
          dtde.dropComplete(true);
          return;
        } else if (flavors[i].isFlavorSerializedObjectType()) {
          dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
          Object o = tr.getTransferData(flavors[i]);
          ta.append("Object: " + o.getClass());
          dtde.dropComplete(true);
          return;
        } else if (flavors[i].isRepresentationClassInputStream()) {
          dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
          ta.read(new InputStreamReader((InputStream) tr.getTransferData(flavors[i])),
              "from system clipboard");
          dtde.dropComplete(true);
          return;
        }
      }
      dtde.rejectDrop();
    } catch (Exception e) {
      e.printStackTrace();
      dtde.rejectDrop();
    }
  }
  public static void main(String args[]) {
    new Main();
  }
}

您必須在該applet(或TextArea,在兩種情況下都可以設置自己的傳輸處理程序)中實現自己的Transferhandler:

注意:這大部分是1:1,取自Java拖放教程

public AppletTest() throws HeadlessException {
    super();
    TransferHandler tf = new TransferHandler(){
        @Override
        public boolean canImport(TransferSupport arg0) {

            for (DataFlavor df:  arg0.getDataFlavors() ){
                if (df.isFlavorJavaFileListType() ){
                    return true;
                }
            }
            //we only accept files
            return false;
        }

        @Override
        public boolean importData(TransferSupport arg0) {
            try {

                @SuppressWarnings("unchecked")
                List<File> oList = (List<File>) arg0.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
                for(File o: oList){
                    System.out.println("file:"+o);                      
                }
            } catch (UnsupportedFlavorException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return super.importData(arg0);
        }

    };
    this.setTransferHandler(tf);
}

一旦有了文件,其余的應該很容易...

然后需要將transferHandler設置為textArea(如上所述)...

private JtextArea ta;
public AppletTest() throws HeadlessException {
    super();
    TransferHandler tf = new TransferHandler(){
        //code as above
        @Override
        public boolean canImport(TransferSupport arg0) {

            for (DataFlavor df:  arg0.getDataFlavors() ){
                if (df.isFlavorJavaFileListType() ){
                     return true;
                }
            }
            //we only accept files
            return false;
        }


        @Override
        public boolean importData(TransferSupport arg0) {
            try {
            @SuppressWarnings("unchecked")
                List<File> oList = (List<File>) arg0.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
                 //check that you don't have multiple files selected
                if (oList.size() == 1){
                    File myFile = oList.get(0);
                    ta.setText(myFile.toString() );
                }
            } catch (UnsupportedFlavorException e) {
                e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
            }
            return super.importData(arg0);
        }
    };

    ta = new JTextArea();
    this.add(ta);   
    ta.setTransferHandler(tf);

}

我希望能有所幫助...

根據要求:整個數據上下文:

public class AppletTest extends JApplet{

    private JTextArea ta;

    public AppletTest() throws HeadlessException {
        //as seen above
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM