替换 JTextArea 中的 TransferHandler 实现会破坏 Ctrl+C - 为什么?

问题描述 投票:0回答:1

为了管理将文件“拖放到”

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
)...为什么?

java swing
1个回答
0
投票

这里正确的做法不是实现

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);
        }
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.