1

私はJavaに比較的慣れていないので、sのVisualObject間でインスタンスをドラッグアンドドロップできるというクラスを作成しようとしていますJPanel

これは、 を実装する のgetTransferData関数です。VisualObjectTransferable

    public Object getTransferData(DataFlavor d)
        throws UnsupportedFlavorException, IOException {

        if (d != visualObjectDataFlavor) {
            throw  new UnsupportedFlavorException(d);
        }   
        return this;
   }

ただし、TransferHandlerJPanelの場合はこの行を実行します

System.out.println(t.getTransferData(VisualObject.visualObjectDataFlavor).equals(t.getTransferData(VisualObject.visualObjectDataFlavor)));

そして、それは常に を返しますfalse。転送されているオブジェクトへの一貫したポインターを実際に返すにはどうすればよいですか? または、転送する良い方法はありますか?

2番目の編集:

私の元のコードはまだ下にありますが、この非常に単純化されたコードでも問題が発生します。

package trytwo;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

public class SimplifiedVisualObject implements Transferable {

    public static void main(String[] args) {        
        SimplifiedVisualObject a, b;
        a = new SimplifiedVisualObject();
        b = new SimplifiedVisualObject();
        try {
            System.out.println(a.getTransferData(DataFlavor.imageFlavor).equals(b.getTransferData(DataFlavor.imageFlavor)));
        } catch (UnsupportedFlavorException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Object getTransferData(DataFlavor flavor)
            throws UnsupportedFlavorException, IOException {
        return this;
    }

    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return null;
    }

    @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return false;
    }

}

編集:

以下は、私がVisualObject作成TransferableObjectFrameた3つのクラスVisualObjectです。MainObjectFrame

VisualObject:

package tryone;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.geom.Ellipse2D;
import java.io.IOException;
import javax.swing.JComponent;

public class VisualObject extends JComponent implements Transferable {

    private static final long serialVersionUID = -7105793092357377791L;
    public static DataFlavor visualObjectDataFlavor = new DataFlavor(VisualObject.class, "Visual Object");

    public VisualObject() {
        setOpaque(true);
        setLayout(null);
    }


    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.black);
        g2d.fill(new Ellipse2D.Double(0, 0,getWidth(),getHeight()));
    }

    @Override
    public Transferable getTransferData(DataFlavor d)
            throws UnsupportedFlavorException, IOException {

        if (d != visualObjectDataFlavor) {
            throw  new UnsupportedFlavorException(d);
        }   
        return this;
    }


    @Override
    public DataFlavor[] getTransferDataFlavors() {
        DataFlavor d[] = {visualObjectDataFlavor};
        return d;
    }


    @Override
    public boolean isDataFlavorSupported(DataFlavor d) {
        if (d == visualObjectDataFlavor) {
            return false;
        }
        return false;
    }

    public VisualObject getThis() {
        return this;
    }
}

ObjectFrame:

package tryone;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
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 java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;


public class ObjectFrame extends JFrame implements DragGestureListener {

    private static final long serialVersionUID = 4330669242071962048L;
    protected Cursor draggingCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
    private JPanel panel;



    public ObjectFrame() {
        setVisible(true);
        setSize(300, 400);
        setLayout(new BorderLayout());
        setTitle("Object Tray");

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        panel = new JPanel();
        panel.setBackground(Color.white);
        panel.setLayout(null);
        add(panel, BorderLayout.CENTER);


        final DragSource ds = new DragSource();
        final DragGestureListener handle = this;

        panel.setTransferHandler(new ObjectTransferHandler());

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                VisualObject v = null;


                v = new VisualObject();
                v.setSize(50, 50);
                v.setLocation(100, 100);
                ds.createDefaultDragGestureRecognizer(v,
                        DnDConstants.ACTION_COPY, handle);
                panel.add(v);

                panel.repaint();
            }
        });
    }

    @Override
    public void dragGestureRecognized(DragGestureEvent dge) {
        if (dge.getComponent() instanceof Transferable) {
            dge.startDrag(draggingCursor, (Transferable) dge.getComponent());
        }
    }

    private class ObjectTransferHandler extends TransferHandler {
        private static final long serialVersionUID = 5072686271469629699L;

        public ObjectTransferHandler() {
        }

        public boolean canImport(TransferSupport t) {
            if (t.isDataFlavorSupported(VisualObject.visualObjectDataFlavor))  {
                return true;
            }
            return false;        
        }

        public boolean importData(TransferSupport ts) {
            Transferable t = ts.getTransferable();
            try {
                System.out.println(t.getTransferData(VisualObject.visualObjectDataFlavor) == (t.getTransferData(VisualObject.visualObjectDataFlavor)));

                return true;
            } catch (UnsupportedFlavorException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           
            return false;
        }
    }
}

Main:

package tryone;

import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
        JFrame f1 = new ObjectFrame();
        JFrame f2 = new ObjectFrame();
    }

}
4

1 に答える 1

1

SimplifiedVisualObjectバージョンについて:getTransferData()メソッド return this. 2 つの異なるインスタンスを作成しているため、オーバーライドさa.equals(b)れない限り、一般に常に false である効果的に比較しています。equals()

元の質問について:コードをデバッグすると、VisualObject. getTransferData()別のインスタンスを呼び出すたびに返されるため、equals()比較は false を返します。

DataFlavor.imageFlavor正確な理由は説明できませんが、使用すると期待どおりに動作します。

おそらく、不明なフレーバーを使用する場合、デフォルトのドラッグ アンド ドロップの実装では、それを処理する方法がわかりません。その結果、転送可能なオブジェクトは転送中にシリアライズおよびデシリアライズされ、常に異なるインスタンスが作成されます。

編集:実際には、Javaチュートリアルで答えが得られます。これは、オブジェクトをローカルに(同じアプリケーション内で)のみ転送することがわかっている場合は、新しいDataFlavorlikeを作成する必要があることを示唆していvisualObjectDataFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=tryone.VisualObject");ます(例のように静的フィールドとして使用するには、静的初期化ブロック)。これにより、アプリケーションでローカル オブジェクトを転送していることをシステムに知らせることができるため、オブジェクト比較テストに合格した同じインスタンスが返されます。

于 2013-07-14T21:56:51.270 に答える