хорошая работа, теперь я просто хочу знать, почему, если я добавляю в цикл while, то команда System.out.println ниже прогресса отображается на обоих, cmd и Pgbar в Gui ?? :JProgressBar не обновляет, не может найти подсказку
while(progress < 99){
System.out.println("into while of PBar Thread progress = "+progress);
if(progress != Path.operationProgress){
operationProgressBar.setValue(progress);
progress = Path.operationProgress;
operationProgressBar.repaint(); } }
нужна помощь вокруг, я не могу получить JProgressBar обновить, я не может использовать SwingWorker, я должен решить эту проблему без него. переменная Path.operationProgress - это статическая переменная из класса «Путь» , и она обновляется из другого потока, поэтому я думаю, что PBar и экземпляры Path выполняются в пользовательских потоках, а не в EDT. вот код индикатора выполнения:
import javax.swing.*; public class Pbar extends Thread { JProgressBar operationProgressBar; public Pbar(JProgressBar operationProgressBar) { this.operationProgressBar = operationProgressBar; } @Override public void run() { int progress = Path.operationProgress; while(progress < 99) { if(progress != Path.operationProgress) { operationProgressBar.setValue(progress); progress = Path.operationProgress; operationProgressBar.repaint(); }}} }
это действие, которое запускает темы:
private javax.swing.JProgressBar operationProgressBar; private javax.swing.JLabel pathImage; private javax.swing.JButton simulatedAnnelingButton; public class TSPGUI extends javax.swing.JFrame { TSPMG tspInstance; Path p, result; String filename = ""; int neighborHood_Type = 1, i = 0; // ......Constructor Stuff and init() private void simulatedAnnelingButtonActionPerformed(java.awt.event.ActionEvent evt)
{
са Thread = новая тема() { @Override общественной недействительным бежать() { результат = p.SimulatedAnnealing (соседHood_Type); Строка lastCostString = result.Cost() + ""; lastCostLabel.setText (lastCostString); }}; sa.start(); Pbar pb = новый Pbar (operationProgressBar); pb.start(); } // Некоторые другие вещи ... }
Несмотря на вашу заботу, чтобы попытаться сделать что-то в фоновом потоке, ваша проблема пахнет как вопрос многопоточности - либо, что либо JProgressBar обновляется не один отображается. Однако, без лишнего кода, это трудно сказать. Если приведенный выше код запускается в фоновом потоке, вы должны позаботиться о вызове индикатора выполнения setValue (...) на EDT, хотя это не решит вашу проблему, это может помешать некоторым прерывистым исключениям. Я предлагаю вам показать нам больше кода, желательно [sscce] (http://sscce.org). –
Пожалуйста, используйте последовательный и логический отступ для кодовых блоков, и нет необходимости в пустой строке после каждой строки кода! –
Кроме того, вы должны стремиться реализовать Runnable, а не расширять Thread. Также как вы используете поток? Вы называете 'start()' или 'run()' на нем? ... ваш вопрос приводит к еще большему числу вопросов, на которые лучше всего будет отвечать [sscce] (http://sscce.org). Я знаю, что здесь звучит как сломанная запись, но все дело в том, что эти чертовы вещи настолько полезны, если они хорошо написаны. –