作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的应用程序中,我放置了一个按钮,单击该按钮使 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;
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();
}
}
但是,尽管 GlassPane 可见,但 ProgressBar 并未更新。需要帮助的 friend 。
最佳答案
这是一个典型的错误:您通过 Thread.sleep()
上的循环阻塞了 EDT(事件调度线程)。 EDT 调度所有 GUI 事件:绘画事件、鼠标事件、按键事件、 Action 事件等...由于您在 EDT 中循环并 hibernate (在 ActionEvent 期间),它会阻止显示刷新(我敢打赌)单击该按钮后,您的 GUI 变得无响应)。所以
sleep()
,并且要解决此问题,请使用 SwingWorker
或 javax.swing.Timer
。这也可以与传统的线程和执行器(线程池)一起使用,但您必须确保所有修改 GUI 的尝试都在 EDT 中执行。
您可能想看看this example它展示了如何组合 JProgressBar 和 SwingWorker
关于java - 线程未更新 GlassPane 上的进度栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139298/
我是一名优秀的程序员,十分优秀!