让Jlabel在单击后立即出现,然后在Java中运行代码后消失,如Java进度加载器,单击操作后的事件序列
我对JAVA非常陌生,但我正在尝试创建一个进度加载器,似乎无法找到正确的方法让它在正确的时间出现和消失。基本上我有一个按钮,可以触发一堆代码。此代码可能需要几分钟才能运行。在此期间,我希望显示一个动画hour glass.gif,并在完成后将其清除 基本上,计时器位于jlabel内部,并在开始时设置为不可见。 当在动作事件中单击Jbutton时,我首先写入并将其设置为visible,然后它们的语句类似于50个if语句,还有一些函数写入cmd并检索输出。然后,一旦所有这些都完成了,我就写信让它再次隐形。唯一的问题是,它只有在代码的进度完成后才会出现,这完全违背了将其用作进度加载器的目的。有人知道如何达到这个效果吗? 代码如下:让Jlabel在单击后立即出现,然后在Java中运行代码后消失,如Java进度加载器,单击操作后的事件序列,java,action,sequence,jlabel,Java,Action,Sequence,Jlabel,我对JAVA非常陌生,但我正在尝试创建一个进度加载器,似乎无法找到正确的方法让它在正确的时间出现和消失。基本上我有一个按钮,可以触发一堆代码。此代码可能需要几分钟才能运行。在此期间,我希望显示一个动画hour glass.gif,并在完成后将其清除 基本上,计时器位于jlabel内部,并在开始时设置为不可见。 当在动作事件中单击Jbutton时,我首先写入并将其设置为visible,然后它们的语句类似于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);
}
});
我肯定我可能根本就不明白什么东西是如何工作的。有人知道为什么会发生这种情况,以及如何使它正常工作,或者至少使用一些简单的技巧使它看起来像是在工作吗?
非常感谢您的帮助 从外观上看,您正在主线程上执行所有操作,这会导致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);
}
}
private JLabel lblLoading;
私有更新任务;
...
lblLoading=新的JLabel(“加载”);
setIcon(新的图像图标(“hourglass.gif”);
lblloadeding.立根(407,274,132,74);
lblLoading.setVisible(false);
//按钮代码
setIcon(新的ImageIcon(“image/checkicon.png”);
btnCheckUpdates.setBounds(2163614834);
frame.getContentPane().add(btnCheckUpdates);
//单击时的操作事件
btnCheckUpdates.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
task=newupdateTask().execute();
}
});
}
私有类UpdateTask扩展SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
lblLoading.setVisible(true);
//初始化进度
setProgress(0);
//背景逻辑在这里
//如有必要,可更新进度
统计进展(50);
进度(100);
返回null;
}
@凌驾
受保护的void done(){
lblLoading.setVisible(false);
}
}
甲骨文的网站上还有一个功能齐全的