为了管理将文件“拖放到”
JTextArea
中,在JPanel
的构造函数中,我这样做:
TransferHandler transferHandler = new DecoderTransferHandler();
requestTextArea.setTransferHandler(transferHandler);
DecoderTransferHandler
是 JPanel
的内部类
class DecoderTransferHandler extends TransferHandler {
@Override
public boolean canImport(TransferSupport support) {
if(support.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
return true;
return super.canImport(support);
}
@Override
public boolean importData(TransferSupport support) {
try {
if(!canImport(support))
return false;
List<File> files = (List<File>) support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
if (files.isEmpty())
return super.importData(support);
// etc...
validate();
return true;
} catch (Exception e) {
showError(e);
return false;
}
}
}
它就像一个魅力,除了 Ctrl+C 对于这个特定的 JTextArea 不再起作用(
requestTextArea
)...为什么?
这里正确的做法不是实现
TransferHandler
,而是子类化 DropTarget
并替换它。仅重新定义您想要自定义的方法。带文本的拖放手势仍然像以前一样工作。
requestTextArea.setDropTarget(new DropTarget(){
@Override
public synchronized void drop(DropTargetDropEvent dtde) {
try {
if(!dtde.getCurrentDataFlavorsAsList().isEmpty() &&
dtde.getCurrentDataFlavorsAsList().get(0).getHumanPresentableName().equals("application/x-java-file-list")) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
List<File> files = (List<File>) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
// use files...
dtde.dropComplete(true);
validate();
}
else
super.drop(dtde);
} catch (Exception e) {
e.printStackTrace();
showError(e);
dtde.dropComplete(false);
}
}
});