准备单击一个按钮 然后弹出一个进度条, 显示进度。问题来了。。。
我现在单击按钮之后 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 事件线程中运行的,如果我们的代码耗时就不应该运行在事件线程中。它不仅是阻塞了我们的输入,同时也阻塞了状态改变(比如绘制背景色,这些跟值和输入没有关系的操作)。