Тонны JProgressBar
вопросов, которые я знаю, но через все ответы, и я не могу показать свою проблему. Я обрабатываю файл с помощью программного обеспечения для проверки адреса. Я нажимаю кнопку «Процесс», и мне нужно, чтобы мой 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%. Приносим извинения, если это повторяющийся вопрос, но я сделал серьезный рыть на этом сайте без везения. Любая помощь очень ценится.
Edit:
Per рекомендуется дублировать, я попытался это:
public void update(){
new SwingWorker<Void,Void>() {
protected Void doInBackground() throws Exception {
jProgressBar0.setValue(BulkProcessor.getPercentComplete());
return null;
};
}.execute();
}
А затем попытался вызвать этот метод обновления() под actionPerformed()
(переключился t.start()
с update()
). У меня все еще такая проблема.
Редактировать
По рекомендации user1676075, однако тот же вопрос:
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();
}
}
Не блокируйте EDT (Event Dispatch Thread) - графический интерфейс «замерзнет», когда это произойдет. Вместо вызова 'Thread.sleep (n)' реализовать Swing 'Timer' для повторения задач или' SwingWorker' для длительных задач. Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). ..OK это комментарий, который я опубликовал, основываясь на названии. Но .. 'Thread.sleep (100);' * inside * a SwingWorker'? Это странность персонифицирована! Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –
Это [дубликат] (http://stackoverflow.com/questions/8251607/running-a-jframe-with-a-jprogressbar). –
См. Приведенный выше раздел «Редактирование», я основывал это на дублирующей ссылке Uwe Plonus – TaylorSmolik