Я знаю, что здесь тонны JProgressBar
вопросов, но, судя по всем ответам, я не могу диагностировать свою проблему. Я обрабатываю файл с помощью некоторого программного обеспечения для проверки адреса. Я нажимаю кнопку «Обработать», и мне нужно, чтобы мой JProgressBar
обновлялся с каждым обрабатываемым файлом. Вот кнопка:
private JButton getJButton0() {
...
jButton0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
jButton0ActionActionPerformed(event);
t.start();
}
...
По рекомендации всех, я использовал метод setValue()
в потоке
Thread t = new Thread(){
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgressBar0.setValue(BulkProcessor.getPercentComplete());
}
});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
...
BulkProcessor.getPercentComplete()
— это метод, который я вызываю из другого класса, который представляет процент выполнения. Я протестировал этот метод, и он корректно обновляется. Проблема в том, что индикатор выполнения не будет обновляться до тех пор, пока файлы не будут обработаны, а затем он поднимется до 100%. Прошу прощения, если это повторяющийся вопрос, но я безуспешно копался на этом сайте. Любая помощь очень ценится.
Изменить:
В соответствии с рекомендуемым дубликатом я пробовал это:
public void update(){
new SwingWorker<Void,Void>() {
protected Void doInBackground() throws Exception {
jProgressBar0.setValue(BulkProcessor.getPercentComplete());
return null;
};
}.execute();
}
А затем попытался вызвать этот метод update() под actionPerformed()
(переключил t.start()
на update()
). У меня все еще та же проблема.
Изменить
На основании рекомендации пользователя 1676075, однако та же проблема:
public static void update(){
new SwingWorker<Void,Integer>() {
protected Void doInBackground() throws Exception {
do
{
percentComplete = BulkProcessor.getPercentComplete();
publish(percentComplete);
Thread.sleep(100);
} while(percentComplete < 100);
return null;
}
@Override
protected
void process(List<Integer> progress)
{
jProgressBar0.setValue(progress.get(0));
}
}.execute();
}
Изменить
Вот код из моего класса BulkProcessor
private String getOutputLine( String searchString, String inputLine )
throws QasException
{
..(code for processing lines)..
countRecord++;
percentComplete = (int) Math.round((countRecord/totalRecord)*100);
totalRecord
обновляется в основном классе моего класса BulkProcessor
public static void main( String input, String output ){
count.clear();
try{
String inputFile = input;
String outputFile = output;
LineNumberReader lnr = new LineNumberReader(new FileReader(new File(input)));
lnr.skip(Long.MAX_VALUE);
totalRecord = lnr.getLineNumber() + 1; //line count in file
BulkProcessor bulk = new BulkProcessor(inputFile, outputFile, ConfigManager.DFLT_NAME);
bulk.process();
}catch(Exception e ){
e.printStackTrace();
}
}
Thread.sleep(n)
реализуйте SwingTimer
для повторяющихся задач илиSwingWorker
для длительных задач. Дополнительные сведения см. в разделе Параллелизм в Swing. ..Хорошо, это комментарий, который я разместил, основываясь на заголовке. Но..Thread.sleep(100);
внутриSwingWorker
? Это воплощение странности! Чтобы быстрее получить помощь, опубликуйте SSCCE. - person Andrew Thompson   schedule 13.06.2013countRecord
иtotalRecord
вBulkProcessor
? - person Harald K   schedule 24.06.2013