내 프로그램에 JProgressBar를 추가하려고하지만 업데이트가 없습니다! 이 값은 100 % 원인을 한 번만 변경합니다. 내 방법이있다.JProgressBar가 업데이트되지 않습니다
public void downloadImages(List<String> images) {
if (errorCode == 0) {
for (int i = 0; i < images.size(); i++) {
if (errorCode == 0) {
main.progressLabel.setText("Downloading image " + Integer.toString(i + 1) + " of " + Integer.toString(images.size()));
String imageStr = images.get(i);
String imageName = imageStr.substring(imageStr.lastIndexOf("/") + 1);
try {
URL url = new URL(imageStr);
InputStream in = url.openStream();
OutputStream out = new FileOutputStream(saveDirectory + imageName);
byte[] b = new byte[2048];
int length;
while ((length = in.read(b)) != -1) {
out.write(b, 0, length);
}
in.close();
out.close();
} catch (MalformedURLException e) {
errorCode = BAD_URL;
} catch (IOException e) {
errorCode = INVALID_PATH;
}
main.progressBar.setValue(((i+1)/images.size())*100);
}
}
}
}
진행률 막대 값을 변경하는 것은 위의 방법의 맨 아래에 있습니다.
그리고 어떻게 그 방법을 호출 할 수 있습니다.
public void download() {
final Downloader downloader = new Downloader(this, albumUrl.getText(), downloadPath.getText());
progressBar.setValue(0);
downloadButton.setEnabled(false);
new Thread(new Runnable() {
public void run() {
List<String> images = downloader.getImages(downloader.getPageSource());
downloader.downloadImages(images);
if (downloader.getErrorCode() == 0) {
progressLabel.setText("All images have been downloaded!");
} else {
String error = "";
switch (downloader.getErrorCode()) {
case Downloader.BAD_URL:
case Downloader.NOT_IMGUR_ALBUM:
error = "The URL entered is either invalid or does not link to an Imgur album.";
break;
case Downloader.BLANK_URL:
error = "The album URL field cannot be blank.";
break;
case Downloader.INVALID_PATH:
error = "The system cannot find the download directory path specified.";
break;
case Downloader.BLANK_PATH:
error = "The download directory cannot be blank.";
break;
case Downloader.CANNOT_READ_URL:
error = "An error occoured while reading the URL.";
break;
case Downloader.PARSING_ERROR:
error = "An error occoured while parsing the URL.";
break;
}
JOptionPane.showMessageDialog(Main.this, error, "Error", 0);
}
downloadButton.setEnabled(true);
}
}).start();
}
편집 : 위의 문제는 전혀 문제가 아니며 프로그램에서 소수를 사용하지 않고 정수를 사용했습니다.
+1이 응답을 입력하는 중입니다. 조나단은 현재 코드로 항상 0이 될 것입니다. EDT에서 UI 업데이트 코드를 이동하는 것뿐만 아니라 정밀 문제를 해결하면이 기능이 올바르게 수행되어야합니다. –
+1 예전 다른 문제는 OP가 있고, 아마도 실제 문제를 일으키는 것이지만, 장기 실행 루프에서 edt/edt에서 Swing을 업데이트하는 것은 좋지 않습니다. –
자바가이 일을 한 번도 알지 못해서 죄송합니다.하지만 너희들은 많이 배웠다. EDT, 감사합니다 : D –