更新/ステータス:バグは Oracle に報告され、現在も未解決/未解決: https://bugs.openjdk.java.net/browse/JDK-8054325
OS X の Java 7 および 8 でのみ発生し、Java 6 でも Java 7 Windows でも発生しない奇妙なバグを発見しました。
以下は、不要なコードを可能な限り削除して抽出したバグです。小さなテーブルとボタンが残り、ボタンの上にあるテーブルからセルをドラッグできます。
私たちのプロダクション コードでは、ソース アクションとしてTransferHandler
持つを使用しています。COPY_OR_MOVE
2 つのターゲットがあり、1 つDropTarget
は as を受け入れ、もう 1 つは asMOVE
を受け入れますCOPY
。OS XではJDK/ DropTarget
JREが壊れているようです。COPY
TranferHandler
MOVE
以下のコードを Java 6 (または Windows の Java 7) で実行すると、次のように報告されます (期待どおり)。
not move
is copy
しかし、OS X Java 7 または Java 8 で実行すると、次のようになります。
is move
not copy
私はこれをテストし、Oracle に報告しました (バグレポートはまだ保留中です)。しかし、これは修正されるまでに(長い間)時間がかかるため、ここにいる誰かが「クリーンな」回避策を作成する方法についてアイデアを持っているのではないでしょうか?
ドロップ ターゲットを元のコンポーネントにリンクして、実際のアクション (コピーまたは移動) を伝えないようにしたいと思います。これは非常に複雑に聞こえます。
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;
}
}