3

JTableでドラッグアンドドロップを実行すると、ドラッグ中に表示される選択したセル(選択フレーム)のアウトラインが表示されます。その動作をオーバーライドして、おそらく特別なカーソル以外は何も表示しないようにするにはどうすればよいですか?

WindowsとOSXで次のコードを実行すると、オーバーライドしたい動作が表示されます。

import java.awt.BorderLayout;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;

public class GestureTest
    extends
        JFrame
    implements
        DragGestureListener {

    private final DragSource ds;
    private final JTable jl;
    private static final Object[][] ITEMS = { { "Java" }, { "C" }, { "C++" }, { "Lisp" },
        { "Perl" }, { "Python" } };

    public GestureTest() {
        super("Gesture Test");
        setSize(200, 150);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(final WindowEvent we) {
                System.exit(0);
            }
        });
        jl = new JTable(ITEMS, new Object[] { "Langs" });
        jl.setDragEnabled(true);
        jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        getContentPane().add(new JScrollPane(jl), BorderLayout.CENTER);

        ds = new DragSource();
        // final DragGestureRecognizer dgr =
        ds.createDefaultDragGestureRecognizer(
            jl, DnDConstants.ACTION_MOVE, this);
        setVisible(true);

    }

    @Override
    public void dragGestureRecognized(final DragGestureEvent dge) {
        System.out.print("dragGestureRecognized");
    }

    public static void main(final String args[]) {
        new GestureTest();
    }

}
4

1 に答える 1

0

解決策を見つけましたが、自分で処理する dnd をもう少し書く必要があります。

まず、JTable 自身の dnd 処理を無効にします。jl.setDragEnabled(false);

次に、メソッドに次のコードを使用して自分自身dragGestureRecognizedを呼び出すことができstartDragます。

重要なビットはemptyイメージです。ここで使用nullすると、OS は OS 固有の画像 (Windows ではなし、OS X では灰色のボックス) を表示します。ここで画像を明示的に設定すると、代わりにその画像が表示されます (この場合は空の 1x1 ピクセル画像)。

@Override
public void dragGestureRecognized(final DragGestureEvent dge) {
    System.out.print("dragGestureRecognized");

    Transferable transferable = new Transferable() {
        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return true;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] { DataFlavor.stringFlavor };
        }

        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            return "Hello world!";
        }
    };
    BufferedImage empty = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
    dge.startDrag(null, empty, new Point(), transferable, null);
}
于 2014-04-20T09:47:00.467 に答える