将Swing事件可观察对象与其他可观察对象组合在一起

时间:2016-08-05 13:09:08

标签: java rx-java

我有一个显示错误消息的标签。如果你双击它,你会得到一个显示整个堆栈跟踪的大对话框。我有两个observable:一个用于错误,一个用于点击事件:

final ConnectableObservable<Notification> errorNotifications = pm
    .getNotificationObservable()
    .filter(notification -> notification.getType().isError() && !notification.getLongMessage().isEmpty())
    .replay(1);

errorNotifications.connect();

SwingObservable.fromMouseEvents(dialog.getMessagePanel().getMessageLabel())
               .map(MouseEvent::getClickCount)
               .filter(number -> number >= 2)
               .subscribe(integer -> errorNotifications
                   .take(1)
                   .subscribe(notification -> ErrorDialog.showError(dialog.getFrame(), "Error", notification.getLongMessage())));

我过滤通知observable只显示错误并重播最后一个错误,如果我从我的click observable中订阅它。

现在我的问题是,RxJava中是否有任何运算符,我可以通过它来做更多...整洁地?我尝试使用combineLatest(),但这有效果,每次出现错误时,对话框都会打开。

以更抽象的方式:我有两个observable,一个像“master”:如果master observable(click observable)发出一个项目,另一个observable(我的错误通知)应该发出最新的项目。

1 个答案:

答案 0 :(得分:2)

在订阅中使用其他Observable通常是一个设计缺陷。

您可以在此response中查看flatMap运算符。当您发出另一个事件时,它将帮助您发出错误通知。

例如,如果您想在代码中使用flatMap运算符,可以像这样更新:

 final ConnectableObservable<Notification> errorNotifications = 
                                                  pm.getNotificationObservable()
                                                    .filter(notification -> notification.getType().isError() && !notification.getLongMessage().isEmpty())
                                                    .replay(1);

errorNotifications.connect();

SwingObservable.fromMouseEvents(dialog.getMessagePanel().getMessageLabel())
           .map(MouseEvent::getClickCount)
           .filter(number -> number >= 2)
           .flatMap(integer -> errorNotifications.take(1))
           .subscribe(notification -> ErrorDialog.showError(dialog.getFrame(), "Error", notification.getLongMessage())));
相关问题