我是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)));
编辑:
以下是我写的三个类:false
(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
(在其内容窗格中保存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
答案 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");
(将它作为静态字段,如示例中所示,使用静态初始化程序块)。这将让系统知道您正在传输应用程序中的本地对象,因此它将返回通过对象比较测试的同一实例。