我創建了一個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;
}
uj5u.com熱心網友回復:
為了解決EDT受阻的問題,你可以使用javax.swing.SwingWorker。
你的代碼對Processor.getFile()的結果是什么以及對該結果的處理非常模糊,因此我只能對SwingWorker中的結果處理提出粗略的建議。
public ArrayList<Object> 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 {
ImageIcon loadPage = new ImageIcon(new ImageIcon("/Users/me/Pictures/hit. gif").getImage())。
loadingImage.setIcon(loadPage)。
List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor)。
FileWorker fw = new FileWorker( files)。
fw.execute()。
} catch (UnsupportedFlavorException | IOException ex) {
Logger.getLogger(DragnDrop.class.getName()).log(Level.SEVERE, null, ex)。
}
return true。
}
};
DnD.setTransferHandler(th)。
return null;
}
private static class FileWorker extends SwingWorker< Object, Object> {
private final List<File> files;
public FileWorker(List<File> files) {
this.files = files。
}
@Override
protected List<Object> doInBackground() throws Exception {
List<Object> results = new ArrayList<>()。
files.forEach((File file) -> {
String fName = file.getName()。
String fPath = file.getAbsolutePath() 。
Processor starts = new Processor() 。
try {
Object result = starts.getFile(fPath,fName)。
results.add(result)。
發布(result)。
} catch (IOException | InterruptedException ex) {
Logger.getLogger(DragnDrop.class.getName()).log(Level.SEVERE, null, ex)。
}
});
return結果。
}
@Override[/span
protected void process(List<Object> chunks) {
//這里你可以用一些中間結果來更新UI元素。
}
@Override
protected void done() {
//這里你可以用最終的結果來更新UI元素。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/326084.html
標籤:
