如何为NetBeans可视化库场景启用java.awt.nd drop



我已经使用带有ImageIcon的JLabel创建了简单的组件调色板。这是调色板项目的代码:

public class TransferableIcon extends JLabel implements Transferable {
private final Image icon;
public TransferableIcon(Image image) {
super(new ImageIcon(image));
this.icon = image;
setTransferHandler(ImageTransferHandler.getTransferHandler());
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JComponent component = (JComponent)e.getSource();
getTransferHandler().exportAsDrag(component, e, TransferHandler.COPY);
}
});
}
private static final DataFlavor[] FLAVORS = new DataFlavor[]{ DataFlavor.imageFlavor };
@Override
public DataFlavor[] getTransferDataFlavors() {
return FLAVORS;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
boolean result = false;
for(DataFlavor dataFlavor : FLAVORS) {
if(dataFlavor.equals(flavor))
result = true;
}
return result;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if(!isDataFlavorSupported(flavor))
throw new UnsupportedFlavorException(flavor);
else
return icon;
}
}

我自己的TransferHandler类覆盖了一些方法:

public class ImageTransferHandler extends TransferHandler {
private static final TransferHandler TRANSFER_HANDLER = new ImageTransferHandler();
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
Image image = null;
if(c instanceof JLabel) {
JLabel label = (JLabel)c;
Icon icon = label.getIcon();
image = ((ImageIcon)icon).getImage();
return new TransferableIcon(image);
}
else
throw new IllegalArgumentException("Can not transfer such a widget");
}
public static TransferHandler getTransferHandler() {
return TRANSFER_HANDLER;
}
}

我有一个Visual Library场景,通过scene.createView()方法添加到JFrame中。我在场景中添加了一个AcceptAction,创建了自己的AcceptProvider,但它的accept()方法从未被调用:当我试图将TransferableIcon拖动到场景中时,我会看到";不允许";光标,当我把图标放到场景中时什么也没发生。那么,我如何启用"场景"?

问题并不像我想象的那么复杂。在AcceptAction类中,我们看到它只接受带有COPY_OR_MOVE操作的拖放。因此,在您自己的TransferHandler类中,您必须设置完全相同的操作:

@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}

就这样!

最新更新