为什么不返回对当前对象的引用总是返回相同的引用?

时间:2013-07-14 18:43:23

标签: java drag-and-drop

我是Java的新手,我正在尝试创建一个名为VisualObject的类,其实例可以在JPanel之间拖放。

这是getTransferData的{​​{1}}函数,它实现了VisualObject

Transferable

但是,在我 public Object getTransferData(DataFlavor d) throws UnsupportedFlavorException, IOException { if (d != visualObjectDataFlavor) { throw new UnsupportedFlavorException(d); } return this; } 的{​​{1}}我运行此行

TransferHandler

它始终返回JPanel。如何实际返回指向正在传输的对象的一致指针?或者有更好的方法来转移吗?

第二次修改:

我的原始代码仍在下面,但问题仍然出现在这个简化的代码中:

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

编辑:

以下是我写的三个类:falsepackage 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(在其内容窗格中保存Transferable)和{{ 1}},只创建两个ObjectFrame s。

VisualObject

Main

ObjectFrame

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

1 个答案:

答案 0 :(得分:1)

关于 SimplifiedVisualObject 版本:getTransferData()方法返回this。由于您要创建两个不同的实例,因此有效地比较a.equals(b),除非equals()被覆盖,否则VisualObject总是为假。

关于原始问题:如果您调试代码,您会发现getTransferData()也是如此。每次调用equals()时都会返回一个不同的实例,因此DataFlavor.imageFlavor比较返回false。

如果您使用DataFlavor它会按预期工作,但我无法解释原因。

也许当使用未知的味道时,默认的拖拽& drop实现不知道如何处理它。因此,可转移对象在传输过程中被序列化和反序列化,从而导致始终创建不同的实例。

编辑:实际上Java tutorial that suggests给出了答案,当您知道只在本地传输对象(在同一个应用程序中)时,您应该创建新的{{1} } like visualObjectDataFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=tryone.VisualObject");(将它作为静态字段,如示例中所示,使用静态初始化程序块)。这将让系统知道您正在传输应用程序中的本地对象,因此它将返回通过对象比较测试的同一实例。