我有一个带有一堆图形元素的SWT应用程序。我希望用户能够将元素拖动到其“桌面” /“ Windows资源管理器” /“ OS X Finder”中。当他们放置元素时,我需要将其放置到的路径,以便可以在代表该元素的位置创建一个文件。
我认为我不能使用FileTransfer
,因为没有源文件。有一个可以创建文件的源对象,但是只有在知道将文件放在何处时,该对象才能创建。
下面的内联是我要实现的一个简单示例,其中有一个带有标签的文本框。如果用户拖动到某个文件夹或文件,我想获取他们拖动到的路径。如果他们拖动到文件,我想用文本框中的内容替换该文件的内容。如果他们将其拖到文件夹,我想创建一个名为“ TestFile”的文件,其中包含文本框中任何内容。
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class DesktopDragExample {
public static void main(String[] args) {
// put together the SWT main loop
final Display display = Display.getDefault();
display.syncExec(new Runnable() {
@Override
public void run() {
Shell shell = new Shell(display, SWT.SHELL_TRIM);
initializeGui(shell);
//open the shell
shell.open();
//run the event loop
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
});
}
// create the gui
private static void initializeGui(Composite parent) {
GridLayout layout = new GridLayout(2, false);
parent.setLayout(layout);
// make the instructions label
Label infoLbl = new Label(parent, SWT.WRAP);
GridData gd = new GridData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = SWT.FILL;
gd.horizontalSpan = 2;
infoLbl.setLayoutData(gd);
infoLbl.setText(
"You should be able to drag to the desktop, Windows Explorer, or OS X Finder.\n" +
"If you drag to a file, it will replace the contents of that file with the contents of the text box.\n" +
"If you drag to a folder, it will create a file named 'TestFile' whose contents are whatever is in the text box.");
// make the text element
final Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
gd = new GridData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = SWT.FILL;
text.setLayoutData(gd);
// make the label element
Label label = new Label(parent, SWT.NONE);
label.setText("Drag me");
// listener for drags
DragSourceListener dragListener = new DragSourceListener() {
@Override
public void dragStart(DragSourceEvent e) {
e.detail = DND.DROP_COPY;
}
@Override
public void dragFinished(DragSourceEvent e) {
System.out.println("--dragFinished--");
System.out.println("e.data=" + e.data);
}
@Override
public void dragSetData(DragSourceEvent e) {
System.out.println("--dragSetData--");
System.out.println("e.data=" + e.data);
}
};
// the DragSource
DragSource dragSource = new DragSource(label, DND.DROP_COPY);
dragSource.setTransfer(new Transfer[]{FileTransfer.getInstance()});
dragSource.addDragListener(dragListener);
}
private static void draggedTo(String path, String textBoxContents) {
System.out.println("Dragged the contents '" + textBoxContents + "' to '" + path + "'");
}
}
以下是一些存在相同问题的其他人,但到目前为止似乎还没有解决方案:
Drag from SWT to Desktop,..want destination path as String
最佳答案
唯一的方法是创建一个临时文件,然后使用FileTransfer。无论如何,我怀疑那是您必须在本机代码中执行的操作。我看看是否有足够的时间来绘制样本...