Java 如何在使用FTPClient时验证Swing中的JLabel
我想每次用我正在使用FTPClient下载的文件名更新一个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
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