【问题标题】:Drag & drop not working on Mac拖放在 Mac 上不起作用
【发布时间】:2011-05-29 07:09:19
【问题描述】:

我正在尝试将文件从 Finder 拖到我的 SWT 应用程序中。在 Windows 和 Ubuntu 上,以下代码有效:

public class DndTest {

    public static void main(final String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display, SWT.DIALOG_TRIM);
        shell.setText("Drag & drop test");
        shell.setSize(200, 200);
        final FormLayout layout = new FormLayout();
        shell.setLayout(layout);
        final Label lbl = new Label(shell, SWT.NORMAL);
        lbl.setAlignment(SWT.CENTER);
        lbl.setText("Drop files here");
        final FormData layoutData = new FormData();
        layoutData.left = new FormAttachment(50, -100);
        layoutData.top = new FormAttachment(50, -15);
        layoutData.right = new FormAttachment(50, 100);
        layoutData.bottom = new FormAttachment(50, 15);
        lbl.setLayoutData(layoutData);

        final DropTarget dt = new DropTarget(shell,
                DND.DROP_DEFAULT | DND.DROP_MOVE);
        final FileTransfer fileTransfer = FileTransfer.getInstance();
        dt.setTransfer(new Transfer[] { fileTransfer });
        dt.addDropListener(new DropTargetAdapter() {
            @Override
            public void drop(final DropTargetEvent event) {
                System.out.println(event);
                String fileList[] = null;
                final FileTransfer ft = FileTransfer.getInstance();
                if (ft.isSupportedType(event.currentDataType)) {
                    fileList = (String[]) event.data;
                }
                for (final String file : fileList) {
                    System.out.println("- " + file);
                }
            }
        });

        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();

    }

}

我的印象是我的应用程序没有将自己注册为 Mac 上的放置目标,因为将文件悬停在它上面不会给我放置光标。

我正在使用最新的 SWT 3.5(我不能使用 3.6,因为为了兼容性,我需要坚持使用 Carbon & Java 1.5)。

知道这里有什么问题吗?

编辑:我修改了代码,使其成为一个完全封闭的示例。它在 Windows 和 Ubuntu 上将删除的文件名打印到控制台,但在 Mac 上不执行任何操作。

【问题讨论】:

  • 您能否提供一个完全独立的示例?提前致谢。
  • @mklhmnn 我已经编辑了代码。您需要做的就是指定import org.eclipse.swt.*。另请注意,我使用的是 SWT 3.5。
  • 我使用的是 SWT 3.7M4 并且打印了删除的文件名。未显示特殊的放置光标,但我不确定它在 OSX 上的外观。我建议使用最新的 SWT 版本来修复/解决您的兼容性问题。
  • 感谢测试!我猜想它会在更高版本的 SWT 中得到修复,但由于不兼容的数量众多,现在升级对我来说确实不是一个选择。我希望可能有 JNI/JNA 解决方案。
  • 这显然是 SWT 库中的一个限制。我知道有时他们需要时间来实现与 finder 的交互。如果是我,我将尝试查看该功能是否在最新的 SWT 中有效,然后从最新的 SWT 中重构出必要的代码并用作自定义库。我知道它的工作量很大,但我认为没有其他选择。(当然更新除外)

标签: java drag-and-drop swt


【解决方案1】:

既然你有这条线

dt.addDropListener(new DropTargetAdapter() {

这可能意味着在 Mac OS X 上开发 Java SWT 应用程序时存在错误(可能会在以后发布的版本中修复?)

请查看相关的 stackoverflow 问题,用另一种方式表达@here

这可能正是您的问题已作为错误功能请求提交。

【讨论】:

  • 这并不能回答问题,但是由于您提供了一些见解,因此无论如何我已经授予您赏金。感谢您的帮助!
【解决方案2】:

这是 SWT 中的一个错误(issue #267381 是相关的,但可能不是实际问题)。

正如 Mike L. 在评论中指出的那样,它已在 SWT 3.7M4 中修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2013-08-06
    • 2021-11-21
    • 2011-02-19
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多