JAVA:JProgressbar& Files.copy与1类中的Observer和Swingworker [英] JAVA: JProgressbar & Files.copy With Observer and Swingworker in 1 Class

查看:167
本文介绍了JAVA:JProgressbar& Files.copy与1类中的Observer和Swingworker的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

几个月前,我写了一篇文章:我的POST



但我想对一些更改我现在所有的代码是在Swingworker类中。但我想使用MVC方法,并使用观察者模式更新我的变量在视图中。



现在我有这样的

  public class CopyFrame extends JFrame {

private JTextarea textArea;
private JProgresbar progresbar;

public CopyFrame(){
progresbar = new JProgresbar
textArea = new JTextarea();
progresbar.setMaximum(100));
/ *在这个方法中我正确添加组件* /
addComponentsCorrecty();

new Task()。execute();
}


类任务扩展Swingworker< Void,Void> {
/ * Dp这10次* /
Files.Copy );
progresbar.setValue(progresbar.getValue + 10);

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

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

并且我想创建类似

  public class CopyFrame extends JFrame {

private JTextarea textArea;
private JProgresbar progresbar;

public CopyFrame(){
progresbar = new JProgresbar
textArea = new JTextarea();
progresbar.setMaximum(100));
/ *在这个方法中我正确添加组件* /
addComponentsCorrecty();

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

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

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

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

public String getInfo(){
return info;
}
}

我该如何做?因为我不能从2类延伸。
我想从另一个类(TASK)更新progresbar



什么是我最好的选择

解决方案

SwingWorker 提供了一种形式的观察者模式,形式为 PropertyChangeListener



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



示例:





有点累了重写 PropertyChangeListener ,我创建了一个简单的适配器,提供更多的直接事件通知

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

public class SwingWorkerListener< W extends SwingWorker>实现PropertyChangeListener {

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

protected void workerProgressUpdated(W worker){
}

protected void workerStateChanged(W worker){
}

protected void workerStarted(W worker){
}

protected void workerDone(W worker){
}

}

这允许我覆盖我实际感兴趣的方法,记住,Swing基础侦听器实际上是一种观察者模式的形式);




$ b b

I wrote an aricle a couple months agoMY POST

but I want to make some changes to I. Now all my code is worked out in the Swingworker class. But I want to use the MVC methode and use the observer pattern to update my variables in the view.

Now i have something like this

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

and i want to create something like this

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

How can I do this? because I can't extend from 2 classes. I want to update the progresbar from another class (TASK)

what Is my best option

解决方案

SwingWorker provides a form of a observer pattern in the form of a PropertyChangeListener.

This provides notifications about the change in state (running/done/etc) and progress changes.

For example:

Getting a bit tired of re-writing the PropertyChangeListener, I did create a simple adapter which provided more direct event notification

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

}

This allows me to override the methods that I'm actually interested and reduces the amount of repeated/boiler plate code I have to keep writing

Remember, the Swing bases "listeners" are actually a form of an observer pattern ;)

这篇关于JAVA:JProgressbar&amp; Files.copy与1类中的Observer和Swingworker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆