gpt4 book ai didi

java - 没有 JButton 和 PropertyChangeListener 的 JProgressBar

转载 作者:行者123 更新时间:2023-11-30 03:44:49 25 4
gpt4 key购买 nike

我是 JProgressBar 的新手,也是 OOP 概念的新手(学习它),阅读了很多文章并尽力学习它。显示的所有示例都有一个启动进度的按钮,但是我如何创建一个方法,以便在调用该方法时它启动进度?

首先这是我的代码

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);
}
}

当我调用 ExecuteTask() 方法时,我的 jProgressBar 没有监听。我怎样才能让它调用 ExecuteTask() 并执行任务并且 jProgressBar 监听它?

最佳答案

您永远不会将 PropertyChangeListener 添加到任何内容,因此由于没有任何内容监听 SwingWorker 的更改,因此它的更改永远不会传输到 JProgressBar。解决方案:制作完成后,将PropertyChangeListener添加到SwingWorker中。事实上,您没有没有 PropertyChangeListener,只是从您没有使用过的方法借用的一个方法 (??)。

其他问题:学习 OOP,至少是学习 Swing 之前的基础知识。您不应像此处那样使用静态字段。

一些不错的链接:

<小时/>

叹息

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();
}
}

关于java - 没有 JButton 和 PropertyChangeListener 的 JProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com