2012-04-24 29 views
1

我想在Java中实现一个进度JDialog。我正在解析文件,并且我想在开始解析新文件之后刷新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

您应该在工作线程上执行该文件的解析,并更新Event Dispath线程上的进度对话框。几个环节值得一读:

+0

谢谢你的链接,我已经实现了它,它工作正常。 – 2012-04-24 19:51:01

3

我猜想你是在美国东部时间执行文件的解析(事件指派线程)。但是调用repaint()实际上会在EventQueue上推送一个事件,该事件将在EDT上的当前调用完成时分派。由于您阻止了EDT,因此只有在执行完所有工作后才会重新绘制,因此永远不会看到进度条的刷新/重新绘制。

你应该做的就是使用SwingWorker将你的解析工作放在一个单独的线程中并且保持EDT不被阻塞。有很多关于如何在SO或Web上使用SwingWorker的例子。

+0

谢谢你的解释,为什么重绘不工作进展的一个例子,它帮了我许多。我用SwingWorker实现了它,并且它工作正常。 – 2012-04-24 19:51:45