【发布时间】:2021-09-17 13:26:32
【问题描述】:
我创建了一个 java 程序,它通过接受拖放的文件来工作。 每当我拖动小文件时,它都会起作用。但是当我在上面拖动 100MB 的大文件时,它会挂起,直到它完成处理文件。 我正在使用带有 macOS High Sierra 的 Macbook。
public ArrayList result() {
TransferHandler th;
th = new TransferHandler() {
@Override
public boolean canImport(JComponent comp, DataFlavor[] transfarFlavors) {
return true;
}
@Override
public boolean importData(JComponent comp, Transferable t) {
try {
List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
files.forEach((File file) -> {
String fName = file.getName();
String fPath = file.getAbsolutePath();
//I even added animation to show when the file is dropped, since small files are executed fast the animation doesn't show, but large files hang so no animation too.
ImageIcon loadPage = new ImageIcon(new ImageIcon("/Users/me/Pictures/hit.gif").getImage());
loadingImage.setIcon(loadPage);
Processor starts = new Processor();
try {
result = starts.getFile(fPath, fName);
setResult(result());
//fileNameText.setOpaque(true);
} catch (IOException ex) {
Logger.getLogger(DragnDrop.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(DragnDrop.class.getName()).log(Level.SEVERE, null, ex);
}
});
} catch (UnsupportedFlavorException | IOException ex) {
Logger.getLogger(DragnDrop.class.getName()).log(Level.SEVERE, null, ex);
}
return true;
}
};
DnD.setTransferHandler(th);
return result;
}
【问题讨论】:
-
importData()方法在 EDT 上运行,并在运行期间阻止所有 awt/swing 事件的处理。对于可以快速处理的小文件,这不是问题,但对于大文件,这是一个问题。你的importData()方法应该只收集要处理的文件,然后启动一个后台线程来处理它们。 -
@Thomas Kläger 谢谢你的建议,我该怎么做?
标签: java macos file animation drag-and-drop