我对JAVA很新,但我正在尝试创建一些进度加载器,似乎无法找到让它在正确的时间出现和消失的正确方法。基本上我有一个触发一堆代码的按钮。此代码可能需要几分钟才能运行。在这段时间里,我想展示一个动画沙漏.gif,并在完成后消失。
基本上,沙漏是在jlabel内部,并且最初设置为不可见。 当在动作事件中单击Jbutton时,我首先写入将其设置为可见,然后它们就像50个if语句和一些写入cmd并检索输出的函数。然后,一旦完成所有我写,让它再次隐形。唯一的问题是它只会在代码进度完成后才会出现,从而无法将其用作进度加载器。有谁知道如何实现这种效果? 这是代码:
//The JLabel
JLabel lblLoading = new JLabel("Loading");
lblLoading.setIcon(new ImageIcon("hourglass.gif"));
lblLoading.setBounds(407, 274, 132, 74);
lblLoading.setVisible(false);
// The Button Code
btnCheckUpdates.setIcon(new ImageIcon("image/checkicon.png"));
btnCheckUpdates.setBounds(216, 361, 148, 34);
frame.getContentPane().add(btnCheckUpdates);
// the action event on click
btnCheckUpdates.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//I set visible to true in the begening
lblLoading.setVisible(true);
// Here goes like 50 if statements
// call to function which writes to cmd.exe then returns info
// info is checked (like another 50 if statements)
// call to cmd function again
// Now after all the code is written i try to make it invisible again
lblLoading.setVisible(false);
}
});
我确信我可能根本不理解某些东西是如何起作用的。有没有人知道为什么会发生这种情况以及如何让它正常工作或者至少使用一些简单的技巧让它看起来像是在工作? 任何帮助是极大的赞赏!!!
答案 0 :(得分:1)
从它的外观来看,你正在做主线程上的所有事情,导致GUI冻结,直到更新的工作量完成。如果您要在Swing中创建一个进度条,最好的选择是使用SwingWorker,这样您就可以在安全地更新Swing组件的同时执行后台逻辑。在你的情况下,它可能看起来像这样:
private JLabel lblLoading;
private UpdateTask task;
...
lblLoading = new JLabel("Loading");
lblLoading.setIcon(new ImageIcon("hourglass.gif"));
lblLoading.setBounds(407, 274, 132, 74);
lblLoading.setVisible(false);
// The Button Code
btnCheckUpdates.setIcon(new ImageIcon("image/checkicon.png"));
btnCheckUpdates.setBounds(216, 361, 148, 34);
frame.getContentPane().add(btnCheckUpdates);
// the action event on click
btnCheckUpdates.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
task = new UpdateTask().execute();
}
});
}
private class UpdateTask extends SwingWorker<Void,Void> {
@Override
protected Void doInBackground() throws Exception {
lblLoading.setVisible(true);
// Initialize progress
setProgress(0);
// Background logic goes here
// Progress can be updated as necessary
setProgress(50);
setProgress(100);
return null;
}
@Override
protected void done() {
lblLoading.setVisible(false);
}
}
还有一个功能齐全的ProgressBarDemo可以在Oracle的网站上找到。