[英]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.