我正在尝试使用MVC模式使用SWT构建一个简单的Java应用程序。我希望能够在后台发生某些事情时自动更新视图,因此我尝试使用Observer /
Observable模式,但是当Observable更改时,我的Observer似乎从未收到通知。
这是代码:
Launcher.java(主类)
public class Launcher {
public static void main(String[] args) {
Application app = new Application();
PenguinView v = new PenguinView(app);
Controller api = new Controller(app, v);
}
}
Application.java(后台应用程序)
public class Application {
private Penguin _myPenguin;
public Application() {
_myPenguin = new Penguin();
new Thread(_myPenguin).start();
}
public Penguin getPenguin() {
return _myPenguin;
}
}
Penguin.java(模型,我的可观察对象)
public class Penguin extends Observable implements Runnable {
private String _color;
private boolean _isHappy;
private int _myRocks;
public Penguin() {
_color = "Black";
_isHappy = true;
_myRocks = 0;
}
public void paint(String color) {
_color = color;
System.out.println("My new color is " + _color);
setChanged();
notifyObservers();
}
public String getColor() {
return _color;
}
public void upset() {
_isHappy = false;
setChanged();
notifyObservers();
}
public void cheerUp() {
_isHappy = true;
setChanged();
notifyObservers();
}
public boolean isHappy() {
return _isHappy;
}
public void run() {
// Penguin starts walking and find rocks!
while(true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
iFoundRock();
}
}
private void iFoundRock() {
_myRocks++;
System.out.println("I now have " + _myRocks + " rocks");
setChanged();
notifyObservers();
}
}
PenguinView.java(SWT视图,我的观察者)
public class PenguinView implements Observer {
private Application _app;
private Display _d;
private Shell _s;
private Label _penguinColor;
private Label _penguinHumor;
private Label _penguinRocks;
private Button _upset;
private Button _cheerUp;
private Text _newColor;
private Button _paint;
public PenguinView(Application app) {
_app = app;
_d = new Display();
_s = new Shell();
RowLayout rl = new RowLayout();
rl.marginWidth = 12;
rl.marginHeight = 12;
_s.setLayout(rl);
new Label(_s, SWT.BORDER).setText("Penguin Color: ");
_penguinColor = new Label(_s, SWT.BORDER);
_penguinColor.setText(_app.getPenguin().getColor());
new Label(_s, SWT.BORDER).setText(" Humor: ");
_penguinHumor = new Label(_s, SWT.BORDER);
String humor = _app.getPenguin().isHappy() ? "Happy" : "Sad";
_penguinHumor.setText(humor);
new Label(_s, SWT.BORDER).setText(" Rocks: ");
_penguinRocks = new Label(_s, SWT.BORDER);
_penguinRocks.setText(String.valueOf(_app.getPenguin().howManyRocks()));
_upset = new Button(_s, SWT.PUSH);
_upset.setText(":(");
_upset.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e) {
_penguinHumor.setText("Sad");
}
});
_cheerUp = new Button(_s, SWT.PUSH);
_cheerUp.setText(":)");
_cheerUp.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e) {
_penguinHumor.setText("Happy");
}
});
_newColor = new Text(_s, SWT.BORDER);
_paint = new Button(_s, SWT.PUSH);
_paint.setText("Paint!");
_paint.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e) {
//_penguinColor.setText(_newColor.getText());
_app.getPenguin().paint(_newColor.getText());
}
});
_s.pack();
_s.open();
while (!_d.isDisposed()) {
if (!_d.readAndDispatch()) {
_d.sleep();
}
}
}
public void update(Observable obs, Object obj) {
System.out.println("I go here!");
_penguinRocks.setText(String.valueOf(((Penguin)obs).howManyRocks()));
if(obs.equals(_app.getPenguin())) {
_penguinRocks.setText(String.valueOf(((Penguin)obs).howManyRocks()));
}
}
public void update(Observable obs) {
System.out.println("I go there!");
}
Controller.java(控制器)
public class Controller {
Application _app;
PenguinView _v;
public Controller(Application app, PenguinView v) {
_app = app;
_v = v;
// Set observer
_app.getPenguin().addObserver(_v);
}
}
输出 :
I now have 1 rocks
I now have 2 rocks
My new color is Blue
I now have 3 rocks
I now have 4 rocks
您是否知道我在做什么错?
谢谢!
据我所知, PenguinView* 构造函数中的 while 循环阻塞了您的主线程,因此 Controller
永远不会被实例化,而且观察者也永远不会被添加。
***
问题内容: 在学习Angular 2时,我使用了一个可观察的对象通过API来获取一些数据。像这样: 我的帖子模型看起来是这样的: 我面临的问题是地图运算符对Post模型不做任何事情。例如,我尝试为img值设置默认值,但在视图post.img中什么也不显示。我什至用其他模型(Message [])更改了Post [],但行为没有改变。有人可以解释这种行为吗? 问题答案: 当我想在模板中使用计算属性时
现在,我有了一个初始页面,其中有三个链接。单击最后一个“好友”链接后,相应的好友组件将启动。在那里,我想把我的朋友名单变成朋友名单。json文件。到目前为止,一切都很顺利。但我仍然是angular2的HTTP服务的新手,使用RxJs的可观测、映射、订阅概念。我试着理解它,读了几篇文章,但在我进入实际工作之前,我不会正确理解这些概念。 这里我已经做了plnkr,除了HTTP相关的工作。 Plnkr
从合约中提款 在某个操作之后发送资金的推荐方式是使用取回(withdrawal)模式。尽管在某个操作之后,最直接地发送以太币方法是一个 send 调用, 但这并不推荐;因为这会引入一个潜在的安全风险。你可能需要参考 安全考量 来获取更多信息。 这里是一个在合约中使用取回模式的示例,它目标是通过向合约发送最多的钱来成为“最富有的人”, 其灵感来自 King of the Ether。 在下边的合约中
YzObservables 就是 Promise 的超集
Observable.of(1, 2, 3).subscribe( doSomething, reject, resolve); }); The forEach pattern is useful for a sequence of events you only expect to happen once. export class MyApp { private d
基于php-fpm来运行swoole/framework的MVC程序,这是传统的LAMP模式。 Nginx配置 server { listen 80; root /home/htf/workspace/php/swoole.com; index index.php index.html; server_name local.swoole