2
我需要添加對從其他應用程序(文件管理器,Web瀏覽器,MS Word & OO編寫器)拖放圖像到我的應用程序中的JLabel的支持。
在JVM內部有很多關於DnD的例子,但是我找不到從本地應用程序或其他J2SE應用程序拖動的東西。將其他應用程序的支持從Java應用程序中刪除
我該如何添加拖放支持的圖像形式文件管理器,Web瀏覽器,MS Word & OO作家?
感謝
我需要添加對從其他應用程序(文件管理器,Web瀏覽器,MS Word & OO編寫器)拖放圖像到我的應用程序中的JLabel的支持。
在JVM內部有很多關於DnD的例子,但是我找不到從本地應用程序或其他J2SE應用程序拖動的東西。將其他應用程序的支持從Java應用程序中刪除
我該如何添加拖放支持的圖像形式文件管理器,Web瀏覽器,MS Word & OO作家?
感謝
類似的規定:
JComponent dropTargetComponent = ...;
new DropTarget(dropTargetComponent , DnDConstants.ACTION_COPY,
new DropTargetListener() {
public void drop(DropTargetDropEvent dtde) {
Transferable tr = dtde.getTransferable();
if(tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.imageFlavor)) {
Image image = (Image) tr.getTransferData(java.awt.datatransfer.DataFlavor.imageFlavor);
// Do something with image
}
}
...
}
您也可以嘗試針對java.awt.datatransfer.DataFlavor.javaFileListFlavor
因爲來自文件管理器的東西通常是文件的列表返回一個List<File>
。
這裏是一個完全工作示例(從資源管理器的文件管理器,並從Firefox試圖DND):
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
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.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class TestNativeDnD {
protected void initUI() {
final JFrame frame = new JFrame(TestNativeDnD.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel dropTargetComponent = new JLabel("Drop something here") {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 600);
}
};
dropTargetComponent.setHorizontalAlignment(JLabel.CENTER);
final JLabel testLabel = new JLabel();
new DropTarget(dropTargetComponent, DnDConstants.ACTION_COPY, new DropTargetListener() {
@Override
public void drop(DropTargetDropEvent dtde) {
try {
Transferable tr = dtde.getTransferable();
dtde.acceptDrop(DnDConstants.ACTION_COPY);
if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.imageFlavor)) {
Image image = (Image) tr.getTransferData(java.awt.datatransfer.DataFlavor.imageFlavor);
showImageIcon(new ImageIcon(image));
} else if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor)) {
List<File> fileList = (List<File>) tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor);
Iterator<File> iterator = fileList.iterator();
if (iterator.hasNext()) {
File file = iterator.next();
showImageIcon(new ImageIcon(file.getAbsolutePath()));
}
} else {
DataFlavor[] flavors = tr.getTransferDataFlavors();
boolean handled = false;
for (int i = 0; i < flavors.length; i++) {
if (flavors[i].isRepresentationClassReader()) {
Reader reader = flavors[i].getReaderForText(tr);
BufferedReader br = new BufferedReader(reader);
java.lang.String line = null;
while ((line = br.readLine()) != null) {
try {
// kde seems to append a 0 char to the end of the reader
if ("0".equals(line)) {
continue;
}
File file = new File(new URI(line));
showImageIcon(new ImageIcon(file.getAbsolutePath()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void showImageIcon(ImageIcon icon) {
testLabel.setIcon(icon);
frame.pack();
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
@Override
public void dragExit(DropTargetEvent dte) {
// TODO Auto-generated method stub
}
});
frame.add(dropTargetComponent);
frame.add(testLabel, BorderLayout.EAST);
frame.setSize(600, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestNativeDnD().initUI();
}
});
}
}
+1簡單好用的 –
遺憾的是沒有Firefox和OO作家不提供也不'DataFlavor.imageFlavor '或'DataFlavor.stringFlavor'或'DataFlavor.javaFileListFlavor'!也文件管理器只提供'DataFlavor.stringFlavor'!任何想法? – RYN
@ 4r1y4n我剛剛在Win7 Java 6/7上使用FileManager(瀏覽器)和瀏覽器(Firefox)進行了嘗試,它的工作原理類似於魅力。請在我的答案結尾找到一個完整的工作示例 –