Java拖放OS X报告移动而不是复制

时间:2014-08-07 08:29:01

标签: java macos drag-and-drop java-7 droptarget

更新/状态:向Oracle报告错误,目前仍处于打开/未解析状态:https://bugs.openjdk.java.net/browse/JDK-8054325

我发现了一个奇怪的错误,它只能在OS X上的Java 7和8上显示,而不是在Java 6中,在Java 7 Windows上都没有。

以下是提取的bug尽可能多地删除不需要的代码。它给我们留下了一个小桌子和一个按钮,我们可以从按钮顶部的桌子上拖动单元格。

在我们的生产代码中,我们使用TransferHandler作为源操作COPY_OR_MOVE。我们有两个目标,一个DropTarget接受MOVE,另一个接受COPY。似乎在OS X上JDK / JRE被破坏了,因为如果DropTarget接受为COPY,则TranferHandler中的报告是MOVE

如果我们在Java 6(或Windows上的Java 7)上执行以下代码,它会报告(按预期):

not move
is copy

但是当我们在OS X Java 7或Java 8上执行它时,我们得到以下结果:

is move
not copy

我已经测试过并向Oracle报告了这个问题(错误报告仍在审核中)。但是,由于这将需要(loooong)同时修复,也许这里有人知道如何制作一个'清洁'解决办法:

我不希望将放置目标链接到原始组件,告诉它实际操作(复制或移动),这听起来过于复杂。

import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;

public class DropExample extends JPanel {

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        frame.setSize(200, 100);
        frame.add(new DropExample());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public DropExample() {

        add(createTable());

        final JButton button = new JButton("Drop here");
        button.setDropTarget(new DropTarget(button, new DropTargetAdapter() {

            @Override
            public void drop(final DropTargetDropEvent dtde) {
                //Here we accept the drop, as COPY:
                dtde.acceptDrop(DnDConstants.ACTION_COPY);
                dtde.dropComplete(true);
            }
        }));
        add(button);
    }

    private JTable createTable() {

        final DefaultTableModel tm = new DefaultTableModel();
        tm.addColumn("Column 0");
        tm.addRow(new String[] { "Table 00" });

        final JTable table = new JTable(tm);
        table.setDragEnabled(true);
        table.setTransferHandler(new TransferHandler() {

            private static final long serialVersionUID = 1L;

            @Override
            public int getSourceActions(final JComponent c) {
                return COPY_OR_MOVE;
            }

            @Override
            protected Transferable createTransferable(final JComponent c) {
                return new StringSelection(c.toString());
            }

            @Override
            protected void exportDone(final JComponent source, final Transferable data, final int action) {
                System.out.println(((action & DnDConstants.ACTION_MOVE) > 0)?"is move":"not move");
                System.out.println(((action & DnDConstants.ACTION_COPY) > 0)?"is copy":"not copy");
                // On Java 7 it reports: "is move" and "not copy"
                // On Java 6 it (correctly) reports: "not move" and "is copy"
            }

        });
        return table;
    }
}

0 个答案:

没有答案