2012-04-24 2 views
1

Я пытаюсь реализовать прогресс JDialog в Java. Я разбираю файлы, и я хочу, чтобы JDialog обновлялся после того, как я начал разбирать новый файл. Моя проблема в том, что JDialog не освежает. Я попытался перерисовать его или изменить его размер, чтобы он перекрашивал. Я также попытался удалить ярлык и добавить новый.Создание строки прогресса - Обновление JDialog

ProgressDialog класс:

public class ProgressDialog extends javax.swing.JDialog { 
    private JLabel jLabel1; 

    public ProgressDialog(Window frame) { 
     super(frame); 
     this.setResizable(false); 
     this.setLocationRelativeTo(frame); 
     initGUI(); 
     //this.setVisible(true); 

    } 

    private void initGUI() { 
     try { 
      { 
       setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
       getContentPane().setLayout(null); 
       { 
        jLabel1 = new JLabel(); 
        getContentPane().add(jLabel1); 
        jLabel1.setText("In Progress.."); 
        jLabel1.setBounds(12, 12, 215, 52); 
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER); 
       } 
      } 
      this.setSize(255, 114); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void setText(String s){ 
     this.setVisible(true); 
     jLabel1.setText(s); 
     this.resize(this.getSize()); 
     this.repaint(); 
    } 
} 

Как использовать:

ProgressDialog pd = new ProgressDialog(frame); 
for(File file:files){ 
    pd.setText("Parsing " + file + "."); 

    ... 

} 

ответ

4

Вы должны выполнить синтаксический анализ файла в рабочем потоке и обновить диалоговое окно выполнения в теме «Диспетчер событий». Несколько ссылок стоит читать:

+0

Спасибо за ссылки, я внедрил его, и он отлично работает. –

3

Я предполагаю, что вы выполняете синтаксический разбор файлов в EDT (Event Диспетчерская тему). Но вызов repaint() фактически вызывает событие EventQueue, которое будет отправлено, когда ваш текущий вызов в EDT будет выполнен. Поскольку вы блокируете EDT, перерисовка возникает только тогда, когда вы выполнили всю свою работу, и, таким образом, вы никогда не увидите обновление/перерисовку вашего индикатора выполнения.

Что вам нужно сделать, это использовать SwingWorker для размещения вашего синтаксического анализа в отдельном потоке и оставить EDT разблокированным. Существует множество примеров того, как использовать SwingWorker на SO или в Интернете.

+0

Спасибо за объяснение, почему перекрашивать не работает, это помогло мне много. Я реализовал его с SwingWorker, и он отлично работает. –

Смежные вопросы