简体   繁体   English

线程不在GlassPane上更新进度条

[英]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 所以

  • Rule #1: do not block the EDT 规则#1:不要阻止EDT
  • Rule #2: DO NOT BLOCK THE EDT, which leads directly to 规则#2:不要阻挡直接导致的EDT
  • Rule #3: do not sleep() in the EDT, and 规则#3:不要在EDT中sleep() ,和
  • Rule #4: do not perform any lengthy-operation in the EDT 规则#4:不要在EDT中执行任何冗长的操作

To work around this problem, use SwingWorker or javax.swing.Timer . 若要解决此问题,请使用SwingWorkerjavax.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. 这也适用于传统的ThreadExecutors (线程池),但您必须确保所有修改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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM