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

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

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

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

在我们的生产代码中,我们使用的是带有COPY_OR_MOVE作为源操作的TransferHandler 。 我们有两个目标,一个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; } } 

Interesting Posts