Java 如何在使用FTPClient时验证Swing中的JLabel

Java 如何在使用FTPClient时验证Swing中的JLabel,java,multithreading,swing,jlabel,ftp-client,Java,Multithreading,Swing,Jlabel,Ftp Client,我想每次用我正在使用FTPClient下载的文件名更新一个JLabel。我尝试了repaint(),validate(),revalidate(),first invalidate()并立即验证()/revalidate(),但仍然没有任何效果 我的代码如下: if(ae.getActionCommand()=="Download"){ int[] row_indexes=table.getSelectedRows(); notifylb.setText("Downloadi

我想每次用我正在使用FTPClient下载的文件名更新一个JLabel。我尝试了
repaint()
validate()
revalidate()
first invalidate()并立即验证()/revalidate()
,但仍然没有任何效果

我的代码如下:

if(ae.getActionCommand()=="Download"){

    int[] row_indexes=table.getSelectedRows();

    notifylb.setText("Downloading files");
    this.validate();

    for(int i=0;i<row_indexes.length;i++)
    {
         String fn=table.getValueAt(row_indexes[i], 0).toString();  

         notifylb.setText("Downloading: "+fn);  // fn contains filename
         this.validate();

         this.downloadFtpfile(fn);  

    }

    notifylb.setText("SUCCESSFULLY DOWNLOADED FILE(s) !");
    this.validate();
}
if(ae.getActionCommand()=“下载”){
int[]行索引=table.getSelectedRows();
notifylb.setText(“下载文件”);
这个。validate();
对于(int i=0;i建议:

  • 不要使用
    ==
    来比较字符串。而是使用
    等于(…)
    等于信号事例(…)
    方法。
    =
    运算符在两个字符串对象相同时返回true,但这对您来说并不重要,而是要检查两个字符串是否以相同的顺序包含相同的字符,这是上面两个方法检查的
  • 您当前正在Swing事件调度线程或EDT上下载文件,这不仅会阻止JLabel更新,还会导致GUI冻结,因为该线程负责绘制所有Swing图形,包括其自身的组件,并负责与用户进行Swing交互
  • 调用
    repaint()
    revalidate()
    invalidate()
    ,等等……将无法解决此问题
  • 要解决这个问题,请在后台线程中执行下载或任何长时间运行的过程。一种方法是创建一个新线程,使用Runnable加载它,然后调用start,但有一种更好的方法是为Swing GUI量身定制的,那就是创建SwingWorker对象,并在其
    doInBackground()中进行后台编码
    方法。该方法可以帮助您了解如何执行此操作,如果您在尝试中遇到困难,请返回代码
  • 您可能不想提及您的紧迫性,因为这通常会产生相反的效果。请记住,我们都是志愿者,您的紧迫性确实是您的紧迫性,而不是我们的紧迫性,并且没有人喜欢在为他人,特别是志愿者做事情时感到匆忙或压力
祝你好运,欢迎来到stackoverflow

编辑
既然您已经看到了使用普通线程的示例,我想我应该发布一个示例,说明如何使用SwingWorker对象执行此操作:

  if (ae.getActionCommand().equalsIgnoreCase("Download")) {
     final int[] row_indexes = table.getSelectedRows();
     notifylb.setText("Downloading files");

     final List<String> fileNames = new ArrayList<String>();
     for (int i = 0; i < row_indexes.length; i++) {
        fileNames.add(table.getValueAt(row_indexes[i], 0).toString());
     }
     SwingWorker<String, String> downloadSwingWorker = new SwingWorker<String, String>(){
        @Override
        protected String doInBackground() throws Exception {
           for (String fileName : fileNames) {
              publish("Downloading: " + fileName);
              downloadFtpfile(fileName);
           }
           return "SUCCESSFULLY DOWNLOADED FILE(s) !";
        }

        @Override
        protected void process(List<String> chunks) {
           for (String text : chunks) {
              notifylb.setText(text);
           }
        }

        @Override
        protected void done() {
           try {
              String text = get();
              notifylb.setText(text);
           } catch (InterruptedException e) {
              e.printStackTrace();
           } catch (ExecutionException e) {
              e.printStackTrace();
           }
        }
     };

     downloadSwingWorker.execute();
  }
if(ae.getActionCommand().equalsIgnoreCase(“下载”)){
final int[]行索引=table.getSelectedRows();
notifylb.setText(“下载文件”);
最终列表文件名=新的ArrayList();
对于(int i=0;i
编辑2:根据克利奥帕特拉的建议更正

建议:

  • 不要使用
    ==
    来比较字符串。而是使用
    等于(…)
    等于信号事例(…)
    方法。
    =
    运算符在两个字符串对象相同时返回true,但这对您来说并不重要,而是要检查两个字符串是否以相同的顺序包含相同的字符,这是上面两个方法检查的
  • 您当前正在Swing事件调度线程或EDT上下载文件,这不仅会阻止JLabel更新,还会导致GUI冻结,因为该线程负责绘制所有Swing图形,包括其自身的组件,并负责与用户进行Swing交互
  • 调用
    repaint()
    revalidate()
    invalidate()
    ,等等……将无法解决此问题
  • 要解决这个问题,请在后台线程中执行下载或任何长时间运行的过程。一种方法是创建一个新线程,使用Runnable加载它,然后调用start,但有一种更好的方法是为Swing GUI量身定制的,那就是创建SwingWorker对象,并在其
    doInBackground()中进行后台编码
    方法。该方法可以帮助您了解如何执行此操作,如果您在尝试中遇到困难,请返回代码
  • 您可能不想提及您的紧迫性,因为这通常会产生相反的效果。请记住,我们都是志愿者,您的紧迫性确实是您的紧迫性,而不是我们的紧迫性,并且没有人喜欢在为他人,特别是志愿者做事情时感到匆忙或压力
祝你好运,欢迎来到stackoverflow

编辑
既然您已经看到了使用普通线程的示例,我想我应该发布一个示例,说明如何使用SwingWorker对象执行此操作:

  if (ae.getActionCommand().equalsIgnoreCase("Download")) {
     final int[] row_indexes = table.getSelectedRows();
     notifylb.setText("Downloading files");

     final List<String> fileNames = new ArrayList<String>();
     for (int i = 0; i < row_indexes.length; i++) {
        fileNames.add(table.getValueAt(row_indexes[i], 0).toString());
     }
     SwingWorker<String, String> downloadSwingWorker = new SwingWorker<String, String>(){
        @Override
        protected String doInBackground() throws Exception {
           for (String fileName : fileNames) {
              publish("Downloading: " + fileName);
              downloadFtpfile(fileName);
           }
           return "SUCCESSFULLY DOWNLOADED FILE(s) !";
        }

        @Override
        protected void process(List<String> chunks) {
           for (String text : chunks) {
              notifylb.setText(text);
           }
        }

        @Override
        protected void done() {
           try {
              String text = get();
              notifylb.setText(text);
           } catch (InterruptedException e) {
              e.printStackTrace();
           } catch (ExecutionException e) {
              e.printStackTrace();
           }
        }
     };

     downloadSwingWorker.execute();
  }
if(ae.getActionCommand().equalsIgnoreCase(“下载”)){
final int[]行索引=table.getSelectedRows();
notifylb.setText(“下载文件”);
最终列表文件名=新的ArrayList();
对于(int i=0;i