JAVA:JProgressbar & Files.copy 1 中有 Observer 和 Swingworker Class
JAVA: JProgressbar & Files.copy With Observer and Swingworker in 1 Class
几个月前我写了一篇文章
但我想对 I 进行一些更改。现在我所有的代码都在 Swingworker class 中完成。但是我想使用 MVC 方法并使用观察者模式来更新视图中的变量。
现在我有这样的东西
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;
}
}
我该怎么做?因为我不能从 2 classes 扩展。
我想从另一个 class (TASK)
更新进度条
我最好的选择是什么
SwingWorker
以 PropertyChangeListener
的形式提供了一种观察者模式。
这会提供有关状态变化 (running/done/etc) 和进度变化的通知。
例如:
- JProgressBar isn't progressing
- How to use jProgress bar for ProcessBuilder process?
- how to include a progress bar in a program of file transfer using sockets in java
- Java - global, reusable loading dialog
- JProgressBar won't update
有点厌倦了重写 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) {
}
}
这允许我覆盖我真正感兴趣的方法并减少我必须继续编写的 repeated/boiler 板代码的数量
请记住,Swing 基础 "listeners" 实际上是观察者模式的一种形式 ;)
几个月前我写了一篇文章
但我想对 I 进行一些更改。现在我所有的代码都在 Swingworker class 中完成。但是我想使用 MVC 方法并使用观察者模式来更新视图中的变量。
现在我有这样的东西
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;
}
}
我该怎么做?因为我不能从 2 classes 扩展。 我想从另一个 class (TASK)
更新进度条我最好的选择是什么
SwingWorker
以 PropertyChangeListener
的形式提供了一种观察者模式。
这会提供有关状态变化 (running/done/etc) 和进度变化的通知。
例如:
- JProgressBar isn't progressing
- How to use jProgress bar for ProcessBuilder process?
- how to include a progress bar in a program of file transfer using sockets in java
- Java - global, reusable loading dialog
- JProgressBar won't update
有点厌倦了重写 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) {
}
}
这允许我覆盖我真正感兴趣的方法并减少我必须继续编写的 repeated/boiler 板代码的数量
请记住,Swing 基础 "listeners" 实际上是观察者模式的一种形式 ;)