GMs*_*soF 1 java swing swingworker jprogressbar progressmonitor
我的代码如下不起作用,谁能告诉我为什么?还请更正我的代码,我是Java的新手.除此之外,我正在寻找"加载面板组件",类似ProgressMonitor但可能更具吸引力,并且动画更好.如果有人以前使用过这类东西,请建议我.
public class Main extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
ProgressMonitor pm = new ProgressMonitor(frame, "Loading...",
"waiting...",
0, 100000);
for (int i = 0 ; i < 100000 ; i ++){
pm.setProgress(i);
pm.setNote("Testing");
System.out.println(i);
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Main() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
}
}
Run Code Online (Sandbox Code Playgroud)
正如@Mark Rotteveel已经指出的那样,你保持EDT(事件调度线程)被占用."如何显示进度条/监视器"教程包含有价值的信息和代码示例.
但基本上它归结为将计算移动到工作线程(例如使用a SwingWorker),并ProgressMonitor在EDT上显示.由工作者线程决定ProgressMonitor已经取得了什么进展.
而这里是直接链接到该教程,清楚地显示了工作是如何在做的示例代码SwingWorker扩展(在Task该示例类),以及如何ProgressMonitor被加入了更新PropertyChangeListener的SwingWorker,那里的听众传递进度这个ProgressMonitor.
我还建议阅读Swutch中的Concurrency教程,其中包含有关如何Thread结合Swing 处理s的更多信息,以及为什么你不能/不应该在EDT上进行繁重的计算
在Swing中,事件线程是修改和更新GUI的内容.您正在使事件线程忙于for-loop和sleep,因此它无法更新GUI.你在事件线程上做的所有事情都应该是短暂的.其他所有东西都应该从事件线程中移除.
所以你需要将for循环移出事件线程.
| 归档时间: |
|
| 查看次数: |
6995 次 |
| 最近记录: |