线程不更新GlassPane上的进度条 [英] Thread not Updating Progress Bar on GlassPane

查看:155
本文介绍了线程不更新GlassPane上的进度条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的应用程序中,我放置了一个按钮,单击它可以使GlassPane可见,并启动一个线程来更新进度栏的值。下面是代码: - $ /

  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;
导入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);
//开始线程更新进度栏
t = new Thread();
t.start();
}});
add(btn);
setVisible(true);

public void run(){
for(int i = 1; i <= 100; i ++)
{
jp.setProgress(i);
尝试{
Thread.sleep(100);
} catch(InterruptedException e){
// TODO自动生成的catch块
e.printStackTrace();
}
}
t = null;



类CustomGlassPane扩展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;
重绘(100,100,200,20);
// repaint();
}

}

但是,虽然GlassPane可见但ProgressBar没有更新。
需要帮助的朋友。

解决方案

这是一个经典的错误:您正在阻止EDT(Event Dispatching Thread)循环遍历 Thread.sleep()。 EDT分派所有GUI事件:绘画事件,鼠标事件,按键事件,动作事件等...由于您在EDT中循环和休眠(在ActionEvent期间),它会阻止显示刷新(我下注点击按钮后,图形用户界面变得没有响应)。所以

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆