偶用netbeans开发一个桌面程序,主界面是一个jfram窗体,上面添加了一个按钮A和一个jProgressBar进度栏B,偶的想法是:开始启动时,B是隐藏了的,窗口上只能看到按钮A,当一点击按钮A,A就变成灰色(  A.setEnabled(false);  ),B就显示出来,然后从服务器上下载文件,每下载到一个文件,就让B显示前进一个单位,代码如下:
private void AActionPerformed(java.awt.event.ActionEvent evt) {
A.setEnabled(false);  
String[] files;int i=0,j=0;FTPClient client ; 
client=new FTPClient(); 
        try { 
            client.setRemoteHost(HostIp); 
            client.connect(); 
            client.login(strUser, strPasswd); 
            client.setType(FTPTransferType.BINARY); 
            client.chdir(strRemtPath); 
            files=client.dir(); 
            jProgressBar1.setValue(0); 
            jProgressBar1.setMaximum((int)files.length-2); 
            jProgressBar1.setVisible(true); 

            while(i <files.length){ 
                if(files[i].charAt(0)!='.'){ 
                    client.get(strLocPath+"\\"+files[i],files[i]);j++;
                    jProgressBar1.setValue(j); 
                  // jProgressBar1.invalidate();jProgressBar1.validate(); 
                  //jProgressBar1.updateUI(); 
                  // this.invalidate();this.validate();
 
                  //JOptionPane.showMessageDialog(this,"已成功从服务器上下载"+j+"个文件!", "文件下载结果", JOptionPane.INFORMATION_MESSAGE); 
                   System.out.println(j+"\t"+files[i]+"\t"); 
                } 
                i++; 
            } 
}可实际程序运行后,点击了A按钮,并不会马上变灰,进度栏B也不能显示出来,更不能看到B在运行中前进了,好像界面死了一样,窗口没有刷新控件,但System.out.println(j+"\t"+files[i]+"\t"); 输出的数字却显示了程序在进行。直到程序运行完,才看到A变成灰色,B突然走到100%.偶尝试添加绿色被注释掉部分的代码,还是不行,费用用JOptionPane.showMessageDialog这样的办法,让程序在运行中停一下,才能看到A按钮变灰,进度栏B显示出来并前进了一些。可偶下的文件很多,用JOptionPane.showMessageDialog的方法对用户不友好,有什么板块可以解决呢TMD,java超级垃圾,一点都没VC好!

解决方案 »

  1.   

    界面需要paint()才会更新,但是你在事件里面调用一个类似于死循环的东西,那么就无法调用paint来重画。
    因此你应该将下载部分作为一个县城,代码如下:new Thread() 
    {
        public void run()
        {
            while(i <files.length)
            { 
                if(files[i].charAt(0)!='.')
                { 
                    client.get(strLocPath+"\\"+files[i],files[i]);j++; 
                    jProgressBar1.setValue(j); 
                    System.out.println(j+"\t"+files[i]+"\t"); 
                } 
                    i++; 
            } 
        }
    }.start();因为使用到了内部类,所以client和jProgressBar1得声明为final的,祝你好运。
      

  2.   

    不会用就说Java垃圾,那你用VC开发不完了,这不是来群嘲吗
      

  3.   

    ...
    真是受不了LZ了
    在你前天的另一篇帖子中:
    http://topic.csdn.net/u/20090524/16/953aa35e-7bc1-4122-ad50-380d05672c47.html
    我都已经明明白白的给你解决方法了,你说我没看懂你的意思不就是进度条实时刷新么,放一个新的线程里,和你的下载线程分开
      

  4.   

    API重要,多看看,例子之类的
      

  5.   

    在这里说JAVA坏话,我看好你哦!!!
      

  6.   

    长时间任务请用swingUtils里的方法执行,在里面改变了界面的话,请重新绘制