gpt4 book ai didi

Java JFrame 循环更新

转载 作者:行者123 更新时间:2023-12-01 14:40:48 25 4
gpt4 key购买 nike

在来到这里之前,我已经在网络上进行了搜索并阅读了数十个讨论此问题的主题,但我无法解决我的问题。

我想显示上传进度。在下面的代码中,一切正常,除了我的 JFrame 没有更新。我正在使用在另一个主题中找到的技术,但它似乎不起作用。我认为如果你看一下我的代码会更简单(我删除了与问题无关的指令)。

/*
* Correct imports have been done
*/

class GUI extends JFrame {
public JPanel pan;

public GUI(JPanel panel) {
super("Uploading...");
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setPreferredSize(new Dimension(600, 500));
setMinimumSize(new Dimension(600, 500));
setMaximumSize(new Dimension(600, 500));
setDefaultCloseOperation(this.DO_NOTHING_ON_CLOSE);
setLocationRelativeTo(null);

pan = panel;
pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS));

setContentPane(pan);
setVisible(true);
}
}

public class GUIUpload {
private static GUI ui;

public static void main(String args[]) {
JPanel main = new JPanel();
ui = new GUI(main); // create and display GUI
uploadLoop(args, main); // start the upload loop

/*
* After upload is finished
*/
JButton jb = new JButton("Ok");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
ui.setVisible(false);
}
});

ui.getContentPane().add(jb);
ui.getContentPane().repaint();
}

private static void uploadLoop(String[] paths, JPanel monitor) {
/*
* Upload starts here
*/
long transfered;
long size;
InputStream inputStream;

FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("xxxxxx", 21);
boolean success = ftpClient.login("xxxxxx", "xxxxxx");
/*
* Sending
*/
for (int i = 0; i < 4; i++){
if (paths[i] != null){
File localFile = new File(paths[i]);
String remoteFile = "/public_html/papers/" + i + ".pdf";
JLabel label = new JLabel("Uploading...");
ui.getContentPane().add(label);
ui.repaint();

inputStream = new FileInputStream(localFile);
// Monitoring misc
size = localFile.length();
transfered = 0;
int percentage = 0;
// Progress bar
JProgressBar pgb = new JProgressBar();
pgb.setValue(0);
ui.getContentPane().add(pgb);
ui.repaint();
// Upload routine
OutputStream outputStream = ftpClient.storeFileStream(remoteFile);;
byte[] bytesIn = new byte[4096];
int read = 0;
while ((read = inputStream.read(bytesIn)) != -1) {
outputStream.write(bytesIn, 0, read);
transfered += read;
percentage = (int)(transfered * 100.0 / size + 0.5);
System.out.println(percentage);
pgb.setValue(percentage);
ui.repaint();
}
inputStream.close();
outputStream.close();
boolean completed = ftpClient.completePendingCommand();
/*
* End of upload
*/
}
}
} // end try
catch (Exception e){
// Do nothing}
} // end catch
} // end upload method
}

百分比效果很好。文件传输工作正常。 GUI 框架仅在我在 GUIUpload 类的 main 方法中重新绘制它之后更新。当它重新绘制时,我可以看到所有标签和进度条都已正确添加和更新(进度条显示最大值。

所以..我已经有一段时间在寻找如何做到这一点了,我尝试过使用线程,我尝试了很多东西,但没有一个起作用(或者我在尝试它们时做错了一些事情) )。

非常感谢任何能够帮助我的人。

致以诚挚的问候。

最佳答案

  • Swing 是单线程的。当您执行文件下载等占用大量资源的任务时,您可以阻止 Swing 重绘。
  • 原始线程无法工作并不奇怪,因为 Swing 有它自己的 concurrency features提供了一种处理耗时的后台任务的方法。 线程并不是为与 swing 组件交互而设计的。
  • 使用 SwingWorker .

关于Java JFrame 循环更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com