当前位置: 代码迷 >> Java Web开发 >> JAVA中加载使用JProgressBar进度条的疑点 很奇怪 大家进来帮忙看看
  详细解决方案

JAVA中加载使用JProgressBar进度条的疑点 很奇怪 大家进来帮忙看看

热度:162   发布时间:2016-04-16 21:57:11.0
JAVA中加载使用JProgressBar进度条的疑问 很奇怪 大家进来帮忙看看
本帖最后由 u013531487 于 2014-08-31 22:59:30 编辑
准备单击一个按钮 然后弹出一个进度条, 显示进度。问题来了。。。
我现在单击按钮之后 frame 先显示出来 但是进度条不显示 等处理结束之后 突然出现100%的进度条 很奇怪
下边是单击按钮要调用的模拟的调试代码 大家看看。。
public void addProgressBar()
    {
     JFrame frame = null;
        JProgressBar progressbar;
        JButton button;
        
     frame = new JFrame("进度条简单示例");
        frame.setBounds(400, 300, 400, 130);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        Container contentPanel = frame.getContentPane();
        
        progressbar = new JProgressBar();
        progressbar.setOrientation(JProgressBar.HORIZONTAL);
        progressbar.setMinimum(0);
        progressbar.setMaximum(100);
        progressbar.setValue(0);
        progressbar.setStringPainted(true);
        progressbar.setPreferredSize(new Dimension(200, 20));
        progressbar.setBorderPainted(true);
        progressbar.setBackground(Color.pink);

        JPanel panel = new JPanel();
        button = new JButton("运行");
        button.setForeground(Color.blue);
        button.addActionListener(this);
        panel.add(button);

        contentPanel.add(panel, BorderLayout.NORTH);
        contentPanel.add(progressbar, BorderLayout.SOUTH);

        //frame.pack();
        frame.setVisible(true);
        
        try{       //这个延时模拟 其他的耗时处理 这里用SwingUtilities.invokeLater(run); 更新进度条
  Thread.sleep(10000);   //10s处理
  }catch(InterruptedException r)
  {}
    }
  
我试了一下 一直到模拟的10s的处理结束之后 才显示进度条 这是为什么呢?
------解决方案--------------------
i/o 处理的代码在哪里?
------解决方案--------------------
你这个 addProgressBar 被谁调用 ?它是否也在 Event Dispatcher 线程中运行?
Swing 自己的事件是在 Event Dispatcher 事件线程中运行的,如果我们的代码耗时就不应该运行在事件线程中。它不仅是阻塞了我们的输入,同时也阻塞了状态改变(比如绘制背景色,这些跟值和输入没有关系的操作)。
  相关解决方案