Fab*_*ian 5 java swing multithreading swingworker progress-bar
我试图让我的程序在执行某些操作时不断更新方法中的进度条值.然而,直到最后才会发生这种情况,并且UI会冻结.
在查看与我的问题类似的问题后,我尝试实现已接受的解决方案(使用线程)但是我无法使其正常工作.就像他们不在那里一样.
我的程序包含几个类,它们Main
是由Netbeans在JFrame 设计模式下自动创建的类,所以有一些东西,比如static void main
和public Main
那些不确定它的一些内容.在我将把这些方法的片段与我的线程实现一起.
public class Main extends javax.swing.JFrame implements ActionListener, Runnable{
// I added implements ActLis, Runn.....
...
static Main _this; // I included this variable
...
public static void main(String args[]) {
Main m = new Main(); // Added by me
new Thread(m).start(); // Added by me
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Main().setVisible(true);
}
});
}
...
public Main() {
initComponents();
_this = this; // Added by me
}
...
// I also included these 2 methods in the class
public void actionPerformed(ActionEvent e) {
synchronized(this){
notifyAll();
}
}
public void run() {
try{synchronized(this){wait();}}
catch (InterruptedException e){}
progressBar.setValue(50);
}
...
private void buttonPressed(java.awt.event.MouseEvent evt) {
for(int i=0; i<=100; i++) {
for(int j=0; j<=5; j++) {
// does some work
}
run();
}
}
Run Code Online (Sandbox Code Playgroud)
I added...
根据我在网上看到的教程和答案,我评论的所有内容都是我推出的东西,但似乎没有任何效果,感觉我已经尝试了接近一百万种不同的组合......
在此先感谢您的帮助.
Mik*_*ffe 10
这里有一些基础供您查看,如果您可以研究它并理解为什么每一段代码都存在,那么我认为它会有所帮助.随意在评论中提问(虽然我现在要睡觉了!)
例:
public class ProgressBarDemo extends JFrame {
private final JProgressBar progressBar = new JProgressBar(0, 100);
private int progressCounter = 0;
public ProgressBarDemo() {
setContentPane(progressBar);
setPreferredSize(new Dimension(100, 100));
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
new Thread(new Runnable() {
public void run() {
while (progressCounter <= 100) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setValue(progressCounter++);
}
});
try { Thread.sleep(500); } catch (InterruptedException e) {}
}
}
}).start();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ProgressBarDemo().setVisible(true);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
使用SwingWorker代替问题的两种不同方法:
SwingWorker示例1:
....
public ProgressBarDemo() {
setContentPane(progressBar);
setPreferredSize(new Dimension(100, 100));
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
SwingWorker<Integer, Void> worker = new SwingWorker<Integer,Void>() {
public Integer doInBackground() {
while (progressCounter <= 100) {
setProgress(progressCounter++);
try { Thread.sleep(500); } catch (InterruptedException e) {}
}
return 0;
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if ("progress".equals(event.getPropertyName())) {
progressBar.setValue((Integer)event.getNewValue());
}
}
});
worker.execute();
}
....
Run Code Online (Sandbox Code Playgroud)
SwingWorker示例2(不太好,但仍然很有趣):
....
public ProgressBarDemo() {
setContentPane(progressBar);
setPreferredSize(new Dimension(100, 100));
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
new SwingWorker<Integer,Integer>() {
public Integer doInBackground() {
while (progressCounter <= 100) {
publish(progressCounter++);
try { Thread.sleep(500); } catch (InterruptedException e) {}
}
return 0;
}
public void process(List<Integer> progresses) {
Integer maxProgress = null;
for (int progress : progresses) {
if (maxProgress == null || progress > maxProgress) {
maxProgress = progress;
}
}
progressBar.setValue(maxProgress);
}
}.execute();
}
....
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7892 次 |
最近记录: |