1

У меня есть этот кусок кода в JFrame, который будет показывать пользователю прогресс во время импортирующех изображений:Почему мой JFrame не обновляет

public class LoadFrame implements Runnable { 

    JProgressBar progressbar; 
    JPanel loadpanel; 
    MainScreen mainscreen; 
    int progress; 
    JDialog mainloadframe; 

    public LoadFrame(String operation) { 

     mainloadframe = new JDialog(); 
     JLabel operationlabel = new JLabel(operation); 
     progressbar = new JProgressBar(0, 100); 
     loadpanel = new JPanel(); 

     mainloadframe.setSize(300, 75); 
     mainloadframe.setLocationRelativeTo(null); 
     mainloadframe.setLayout(new GridLayout(1, 2)); 
     mainloadframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     mainloadframe.setAlwaysOnTop(true); 
     mainloadframe.setTitle(operation); 
     mainloadframe.setVisible(true); 

     progressbar.setValue(0); 
     progressbar.setStringPainted(true); 
     loadpanel.add(progressbar); 
     loadpanel.add(operationlabel); 
     mainloadframe.add(loadpanel); 

    } 

    public void setMainScreen(MainScreen mainscreen) { 
     this.mainscreen = mainscreen; 
    } 

    public void disposeLoadFrame() { 
     mainloadframe.dispose(); 
    } 

    public void setProgress(int progress) { 
     this.progress = progress; 
    } 

    @Override 
    public void run() { 
     while (progress != 100) { 
      progressbar.setValue(progress); 
     } 
    } 
} 

фактических расчетливый прогресса также сделан в нить, но по какой-то причине индикатор прогресса не отображается на JFrame до момента, когда изображения будут импортированы. Я почти уверен, что это проблема Thread, но я не могу понять, что это. Небольшая помощь будет оценена.

+0

обновления пользовательского интерфейса должна происходить на EDT. Выполнение этого из любого другого потока является неопределенным поведением и вызывает что-либо от ошибочного рисования, неправильные элементы управления появляются повсюду, правильно работая, чтобы вообще не работать. – Joey

ответ

2
  • Runnable#Thread не start()

  • (пост на форумах) нужно добавить в Thread.sleep(int)run(), а затем progressbar.setValue(progress); МЭСТ быть обернуты в invokeLater()

  • с помощью util.Timer вместо Runnable #Thread, затем progressbar.setValue(progress); mest быть обернутым в invokeLater()


  • с помощью Swing Timer

  • надлежащих способов это вызвать progressbar.setValue(progress); из SwingWorker