JAVA:JProgressbar & Files.copy 与 Observer 和 Swingworker 在 1 类中

标签 java copy observer-pattern extends swingworker

几个月前我写了一篇文章MY POST

但是我想对I做一些改变。现在我所有的代码都是在Swingworker类中完成的。但我想使用 MVC 方法并使用观察者模式来更新 View 中的变量。

现在我有这样的东西

    public class CopyFrame extends JFrame {

        private JTextarea textArea;
        private JProgresbar progresbar;

        public CopyFrame(){
            progresbar = new JProgresbar
            textArea = new JTextarea();
            progresbar.setMaximum(100));
            /*in this method I added the components correctly*/ 
            addComponentsCorrecty();

            new Task().execute();
        }


        class Task extends Swingworker<Void,Void>{
            /*Dp this 10 times*/
            Files.Copy(source, destination);
            progresbar.setValue(progresbar.getValue + 10);

            String info = String.format("%s is completed", source)

        textArea.setText(textArea.getText + "\n" + info)
        }
    }

我想创建这样的东西

public class CopyFrame extends JFrame {

    private JTextarea textArea;
    private JProgresbar progresbar;

    public CopyFrame(){
        progresbar = new JProgresbar
        textArea = new JTextarea();
        progresbar.setMaximum(100));
        /*in this method I added the components correctly*/ 
        addComponentsCorrecty();

        Task task = new Task();
        task.addObserver(this);
        task.execute
    }

    @Override
    public void update(){
        progresbar.setValue(progresbar.getValue +10);
        textArea.setText(textArea.getText + "\n" + task.getInfo)
    }   
}
class Task extends Swingworker<Void,Void> extends Observer{

        private String info;
        public Task(){
            doTask;
        }

        public void doTask(){
        /*Dp this 10 times*/
        Files.Copy(source, destination);
        info = String.format("%s is completed", source)
        setChanged();
        notifyObservers();
        }

        public String getInfo(){
            return info;
        }
}

我该怎么做?因为我不能延长两堂课。 我想更新另一个类(任务)的进度条

我最好的选择是什么

最佳答案

SwingWorkerPropertyChangeListener 的形式提供了一种观察者模式。

这提供有关状态更改(正在运行/完成/等)和进度更改的通知。

例如:

对重写 PropertyChangeListener 感到有点厌倦,我确实创建了一个简单的适配器,它提供了更直接的事件通知

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.SwingWorker;

public class SwingWorkerListener<W extends SwingWorker> implements PropertyChangeListener {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        W worker = (W) evt.getSource();
        switch (evt.getPropertyName()) {
            case "state":
                workerStateChanged(worker);
                switch (worker.getState()) {
                    case STARTED:
                        workerStarted(worker);
                        break;
                    case DONE:
                        workerDone(worker);
                        break;
                }
                break;
            case "progress":
                workerProgressUpdated(worker);
                break;
        }
    }

    protected void workerProgressUpdated(W worker) {
    }

    protected void workerStateChanged(W worker) {
    }

    protected void workerStarted(W worker) {
    }

    protected void workerDone(W worker) {
    }

}

这使我能够重写我真正感兴趣的方法,并减少我必须继续编写的重复/样板代码的数量

请记住,Swing 基础“监听器”实际上是观察者模式的一种形式;)

关于JAVA:JProgressbar & Files.copy 与 Observer 和 Swingworker 在 1 类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33136498/

相关文章:

java - 使用初始化 block 有什么好处?

excel - 如何使用密码打开工作簿,禁用事件

mysql - 如何将db1表1中的记录复制到db2表2中

Java:将字符串转换为 double\long,除以 100 并将其转换回字符串(SpEL)

java - Android处理程序,不在ui线程中执行post()

java - 形状旋转 - anchor 不跟随 - JavaFX

perl - 如何使用 Perl 递归复制目录的内容?

ruby-on-rails - Rails 3 : How to identify after_commit action in observers?(创建/更新/销毁)

java - 我应该在 EventDispatcher/Observable 中捕获 Exception、Throwable 还是其他

ios - 在动画期间观察 UIView 框架的变化