[英]Thread not Updating Progress Bar on GlassPane
In the following application I have put a button ,clicking on which makes the GlassPane visible and a Thread starts which updates the Progress bar value.Below is the code:- 在下面的应用程序中,我放了一个按钮,点击它使GlassPane可见,并启动一个Thread更新Progress bar值。下面是代码: -
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class GlassPaneDownload extends JFrame implements Runnable{
Thread t;
CustomGlassPane jp;
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){public void run(){new GlassPaneDownload();}});
}
public GlassPaneDownload(){
super("Glass Pane Download Simulation");
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
jp=new CustomGlassPane();
jp.setOpaque(false);
setGlassPane(jp);
JButton btn=new JButton("Click Here");
btn.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){
//Make Glass Pane visible
jp.setVisible(true);
//Start Thread to update Progress Bar
t=new Thread();
t.start();
}});
add(btn);
setVisible(true);
}
public void run(){
for(int i=1;i<=100;i++)
{
jp.setProgress(i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
t=null;
}
}
class CustomGlassPane extends JComponent
{
private final float pattern[]=new float[]{0.0f,0.499f,0.50f,1.0f};
private final Color color[]=new Color[]{Color.WHITE,Color.GRAY,Color.BLACK,Color.LIGHT_GRAY};
private int progress,oldProgress;
public void paintComponent(Graphics g1)
{
super.paintComponent(g1);
g1.setColor(new Color(1.0f,1.0f,1.0f,0.7f));
g1.fillRect(0, 0, getWidth(), getHeight());
g1.setColor(new Color(200,200,255));
g1.drawRect(100,100,200,20);
LinearGradientPaint p=new LinearGradientPaint(100,100,200,20,pattern,color);
Graphics2D g2=(Graphics2D)g1;
g2.setPaint(p);
g2.fillRect(100, 100,progress*2, 20);
}
public void setProgress(int prog)
{
progress=prog;
repaint(100,100,200,20);
//repaint();
}
}
But,though the GlassPane gets visible but the ProgressBar is not updating. 但是,虽然GlassPane可见但ProgressBar没有更新。 Need Help friends. 需要帮助的朋友。
This is a classical mistake: you are blocking the EDT (Event Dispatching Thread) with a loop over a Thread.sleep()
. 这是一个经典错误:您通过Thread.sleep()
循环阻止EDT(事件调度线程Thread.sleep()
。 The EDT dispatches all GUI events: paint-events, mouse-events, key-events, action-events etc... Since you are looping and sleeping in the EDT (during an ActionEvent), it prevents the display from refreshing (I bet that your GUI becomes unresponsive after you click the button). EDT调度所有GUI事件:绘制事件,鼠标事件,键事件,动作事件等...由于您在EDT中循环和休眠(在ActionEvent期间),它会阻止显示刷新(我打赌)单击按钮后,您的GUI将无响应)。 So 所以
sleep()
in the EDT, and 规则#3:不要在EDT中sleep()
,和 To work around this problem, use SwingWorker
or javax.swing.Timer
. 若要解决此问题,请使用SwingWorker
或javax.swing.Timer
。 This can also work with traditional Thread
's and Executors
(thread-pools) but you have to make sure that all your attempts to modify the GUI are performed in the EDT. 这也适用于传统的Thread
和Executors
(线程池),但您必须确保所有修改GUI的尝试都在EDT中执行。
You may want to have a look at this example which shows how to combine a JProgressBar and a SwingWorker 您可能需要查看此示例 , 该示例显示如何组合JProgressBar和SwingWorker
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.