没有JButton和PropertyChangeListener的JProgressBar [英] JProgressBar without JButton and PropertyChangeListener
问题描述
我是 JProgressBar
的新手,也是OOP概念的新手(学习它)并阅读了很多文章,并尽力学习它。显示的所有示例都有一个按钮,可以在其中开始进度,但是如何创建方法以便在调用方法时它开始进度?
I am new to JProgressBar
and new to OOPs concepts as well (learning it) and read a lot of articles and tried my best to learn it. All of the examples shown had a button which starts progress in it but how can I make a method so that when the method is called it starts progress?
这是我的代码第一个
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
public class ProgressDemo
{
JProgressBar ProgressBar;
Task task;
boolean done = false;
class Task extends SwingWorker<Void, Void>
{
@Override
public Void doInBackground()
{
Random random = new Random();
int progress = 0;
setProgress(0);
while (progress < 100)
{
try
{
Thread.sleep(random.nextInt(1000));
}
catch (InterruptedException ignore){}
progress += random.nextInt(10);
setProgress(Math.min(progress, 100));
}
return null;
}
@Override
public void done()
{
done = true;
}
}
public void propertyChange(PropertyChangeEvent evt)
{
if(!done)
{
int progress = task.getProgress();
if(progress==0)
{
ProgressBar.setIndeterminate(true);
}
else
{
ProgressBar.setIndeterminate(false);
ProgressBar.setString(null);
ProgressBar.setValue(progress);
}
}
}
//I want to make a method here, so that it can be called when ever I want
public void ExecuteTask()
{
task = new Task();
task.execute();
}
public static void main(String[] args)
{
JFrame MainScreen = new JFrame();
JPanel MainPanel = new JPanel();
ProgressBar = new JProgressBar(0, 100);
ProgressBar.setValue(0);
ProgressBar.setStringPainted(false);
MainPanel.add(ProgressBar);
MainScreen.getContentPane().add(MainPanel);
MainScreen.setVisible(true);
}
}
我的 jProgressBar $当我调用 ExecuteTask()方法时,c $ c>没有收听。如何才能调用 ExecuteTask()并执行任务并且jProgressBar会监听它?
My jProgressBar
is not listening when I call ExecuteTask() method. How can I make it to call ExecuteTask() and it execute task and jProgressBar listen to it?
推荐答案
您永远不会将PropertyChangeListener添加到任何内容中,因此没有任何内容正在侦听SwingWorker的更改,因此其更改永远不会传输到JProgressBar。解决方案:在创建后将PropertyChangeListener添加到SwingWorker。事实上 - 你 没有PropertyChangeListener,只是一个方法借用你没有使用的方法(??)。
You never add your PropertyChangeListener to anything, and so since nothing is listening for changes to the SwingWorker, its changes never get transmitted to the JProgressBar. Solution: add the PropertyChangeListener to the SwingWorker after making it. And in fact -- you have no PropertyChangeListener, just a method borrowed from one that you didn't use (??).
其他问题:学习OOP,至少在学习Swing之前的基础知识。你不应该像在这里一样使用静态字段。
Other issues: learn OOPs, at least the rudiments before learning Swing. You should not be using static fields as you're doing here.
一些不错的链接:
- 无法让JProgressBar从SwingWorker类更新
- 了解Java ExecutorService :我最近的最爱。
- JProgressBar无法正常工作:查看MadProgrammer的几个链接。他是这方面的专业人士,几乎任何东西Swing
- Cant get JProgressBar to update from SwingWorker class
- Understanding Java ExecutorService: a recent favorite of mine.
- JProgressBar not working properly: check MadProgrammer's several links. He's a pro at this and pretty much anything Swing
sigh
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.Timer;
@SuppressWarnings("serial")
public class ProgressDemo extends JPanel {
private JProgressBar progressBar = new JProgressBar(0, 100);
private Task task;
boolean done = false;
public ProgressDemo() {
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
add(progressBar);
}
class Task extends SwingWorker<Void, Void> {
@Override
public Void doInBackground() {
Random random = new Random();
int progress = 0;
setProgress(0);
while (progress < 100) {
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException ignore) {
}
progress += random.nextInt(10);
setProgress(Math.min(progress, 100));
}
return null;
}
@Override
public void done() {
done = true;
}
}
private class TaskListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
int progress = task.getProgress();
progressBar.setIndeterminate(false);
progressBar.setString(null);
progressBar.setValue(progress);
}
if (SwingWorker.StateValue.DONE == evt.getNewValue()) {
// always need to know when the SW is done
// so we can call get() and trap exceptions
try {
task.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
}
// I want to make a method here, so that it can be called when ever I want
public void executeTask() {
task = new Task();
task.addPropertyChangeListener(new TaskListener());
task.execute();
}
public static void main(String[] args) {
JFrame mainScreen = new JFrame();
mainScreen.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final ProgressDemo demoPanel = new ProgressDemo();
mainScreen.getContentPane().add(demoPanel);
mainScreen.pack();
mainScreen.setLocationByPlatform(true);
mainScreen.setVisible(true);
// just for yucks, let's wait 3 seconds before calling executeTask()
int delay = 3 * 1000;
new Timer(delay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
demoPanel.executeTask();
// stop timer
((Timer) e.getSource()).stop();
}
}).start();
}
}
这篇关于没有JButton和PropertyChangeListener的JProgressBar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!