Observer<T>

RxJavaは、JavaでReactiveX(リアクティブプログラミング)を実現するためのライブラリ。

GitHub - ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
Observer (RxJava Javadoc 2.2.5)

Eclipseで、

ワークスペース
ワークスペース

ワークスペース指定。

Java プロジェクト
Java プロジェクト

Java プロジェクトを選択。

プロジェクト作成
プロジェクト作成

プロジェクト作成。

ソースなど設定はこのまま
ソースなど設定はこのまま

ソースなど設定はこのまま。

パースペクティブ
パースペクティブ

パースペクティブ

クラスの追加
クラスの追加

クラスの追加。

MainClass.java
MainClass.java

MainClassを追加。

Javaスタンドアロンアプリの場合、どうやってRxJavaを使うのかがわからなかったが、

The Central Repository Search Engine

ひとまずThe Central Repositoryから、

RxJava
RxJava

jarをダウンロード。

lib
lib

jarをlibフォルダの下に置く。

プロパティ
プロパティ

プロパティから、

JARの追加
JARの追加

JARの追加で、

rxjava
rxjava

rxjavaのjarを選択。

クラスを追加
クラスを追加

クラスを追加。

CustomObserver.java
CustomObserver.java

CustomObserverとする。

実装
実装

rx.Observer<String>のインターフェースを実装する。

onNextでarg0を出力。

MainClass.javaは、

表示する文字列"ABC", "XYZ"は配列sarrayにまとめる。
Observable.fromでこのsarrayを持つobservableができる。
observable.subscribeでobserver1とobserver2を登録するのだが、その時点でCustomObserverのonNextが実行される。

onNext: ABC
onNext: XYZ
onNext: ABC
onNext: XYZ

この辺はC#版と使い方が違うので、今後また調べていきたいところ。

Sample/rxjava/Observer_T/Observer_T/src/Observer_T at master · bg1bgst333/Sample · GitHub

IObserver<T>

Reactive Extensionsは、ReactiveX(リアクティブプログラミング)を実現するためのライブラリ。

ReactiveX
GitHub - dotnet/reactive: The Reactive Extensions for .NET
Reactive Extensionsのはじめかた - かずきのBlog@hatena
C#の主要インターフェース解説:IObservable<T>、IObserver<T> - がりらぼ

このカテゴリでは本家のC#版を扱う。

WPFプロジェクトを作成し、

Button
Button

Buttonを選択。

配置
配置

このように配置。
Buttonのハンドラもダブルクリックで用意しておく。

NuGet
NuGet

NuGetから、

System.Reactive
System.Reactive

System.Reactiveで検索。

これを選択
これを選択

1番上のこれを選択してインストール。

一覧
一覧

必要なものが一通りインストールされる。

完了
完了

完了したらこうなる。

新しい項目
新しい項目

新しい項目で、

CustomObserver.cs
CustomObserver.cs

クラスCustomObserver.csを追加。

IObserver&lt;string&gt;
IObserver<string>

IObserver<string>を継承するので、

インターフェース
インターフェース

インターフェースの内部処理を実装する。

自動
自動

自動だとこうなるので、ちょっと修正して、

OnNextで渡された文字列valueをMessageBox.Showで表示する。

新しい項目
新しい項目

新しい項目で、

CustomObservable.cs
CustomObservable.cs

今度はCustomObservable.cs。

インターフェース
インターフェース

こちらもインターフェースを実装。

自動
自動

修正すると、

Subscribeでリスト追加、Executeでforeach実行。

MainWindow.xaml.csは、

customObservableにcustomObserver1、customObserver2の2つを登録。
Buttonがクリックされたら、customObservable.Executeを実行。この時、文字列"ABCDE"を渡す。

実行時
実行時

実行して、Buttonを押すと、

ABCDE(1回目)
ABCDE(1回目)

ABCDE(2回目)
ABCDE(2回目)

customObserver1、customObserver2、と2つあるので、2回表示される。

Sample/rx/IObserver_T/IObserver_T/src/IObserver_T at master · bg1bgst333/Sample · GitHub

TextBox

TextBoxは、MFCなどでいうエディットコントロールにあたるもの。

TextBox Class (System.Windows.Controls) | Microsoft Docs

WPF アプリケーション
WPF アプリケーション

WPFで、

TextBox
TextBox

TextBoxを選択。

配置
配置

このように配置。

Button
Button

Buttonを選択。

配置
配置

このように下に配置。

Buttonダブルクリックで、

ハンドラ処理を書く。
入力されたtextBox1.TextをMessageBox.Showで表示。

実行時
実行時

実行時はこう。

入力
入力

"ABCDE"を入力して、Buttonを押すと、

メッセージボックス
メッセージボックス

このように"ABCDE"が表示。

XYZ
XYZ

"XYZ"でも、

メッセージボックス
メッセージボックス

このように"XYZ"が表示される。

Sample/wpf/TextBox/TextBox/src/TextBox at master · bg1bgst333/Sample · GitHub

TextBlock

TextBlockは、MFCなどでいうスタティックテキストコントロールにあたるもの。

TextBlock Class (System.Windows.Controls) | Microsoft Docs

WPF アプリケーション
WPF アプリケーション

WPFで、

TextBlock
TextBlock

TextBlockを選択。

配置
配置

配置。

Button
Button

Buttonも追加。

配置
配置

このように下に置く。
Buttonをダブルクリックで、

ハンドラが生成されるので、textBlock1.Textに"ABCDE"をセット。

実行すると、

実行時
実行時

こうなるので、Buttonを押すと、

ABCDE
ABCDE

"ABCDE"がtextBlock1にセットされてるのがわかる。

Sample/wpf/TextBlock/TextBlock/src/TextBlock at master · bg1bgst333/Sample · GitHub

RoutedEventHandler

RoutedEventHandlerは、イベントハンドラとなるデリゲート。

RoutedEventHandler Delegate (System.Windows) | Microsoft Docs

"Routed"と名が付いているが、これはそのハンドラでイベント処理終了をしない場合、親要素がイベントを受け取り、そのイベント処理終了をするか判断し、処理終了しない場合、また親要素に渡っていくような、イベントのルーティングが行われるからである。
MFCのCCmdTargetと同じような仕組みである。

WPF アプリケーション
WPF アプリケーション

WPFで、

Button
Button

Buttonを選択し、

配置
配置

配置。

今回は手書きでハンドラを追加。
handlerで"ABCDE"表示処理を書いて、登録はWindow1のコンストラクタでやっている。

これだけだと、

実行時
実行時

実行して、押すと、

ABCDE
ABCDE

"ABCDE"が表示されるだけ。

button2
button2

このようにbutton2を内部に配置する。
button2をダブルクリックして、

今度はbutton2_Clickで"XYZ"を表示するように書く。

実行時
実行時

実行したら、

外側のButton
外側のButton

外側のButtonを押すと、

ABCDE
ABCDE

表示するのはこれだけ。
しかし、

内側のbutton2
内側のbutton2

内側のbutton2を押すと、

XYZ
XYZ

"XYZ"、そして、

ABCDE
ABCDE

"ABCDE"が表示される。
button2のイベントハンドラ処理の後に、親であるButtonのイベントハンドラ処理が実行されるのである。

Sample/wpf/RoutedEventHandler/RoutedEventHandler/src/RoutedEventHandler at master · bg1bgst333/Sample · GitHub

ButtonBase.Click

ButtonBase.Clickは、ボタンがクリックされた時に発生するイベント。

ButtonBase.Click Event (System.Windows.Controls.Primitives) | Microsoft Docs

ここにイベントハンドラを追加すると、クリックされた時に呼び出される。

WPF アプリケーション
WPF アプリケーション

WPFで、

Button
Button

Button。

配置
配置

配置して、Buttonの上でダブルクリックをすると、

button1_Clickというイベントハンドラが自動で追加される。
MessageBox.Showで"ABCDE"を表示。

XAMLの方にも、Click="button1_Click"という形で、Clickに対するイベントハンドラは"button1_Click"であることを示している。

実行時
実行時

Buttonを押すと、

ABCDE
ABCDE

このように表示される。

ButtonBase
ButtonBase

このClickはButtonBaseのClickであることが示されている。

ビルド時
ビルド時

ビルド時にはこれだけのファイルができているのだが、

Window1.g.cs
Window1.g.cs

Window1.g.csには、RoutedEventHandlerを通して、ハンドラ登録が行われてることがわかる。

Sample/wpf/ButtonBase/Click/src/ButtonBase at master · bg1bgst333/Sample · GitHub

Button

ウィンドウ上にボタンを配置する。

Button Class (System.Windows.Controls) | Microsoft Docs

WPF アプリケーション
WPF アプリケーション

今回からWPF アプリケーション。

デザインとXAML
デザインとXAML

デザインとXAMLが上下に分割した画面が出てきたら、

ツールボックス
ツールボックス

ツールボックスからButtonを選択。

Button
Button

デザイン上にButtonを貼り付ける。

XAMLはこんな感じに。

実行時
実行時

実行すると、ウィンドウ上にボタンが配置される。

押した時
押した時

押した時、色や動きは変化するが、特に何も起こらない。
イベントハンドラに処理を書いてないから当然だが。

Sample/wpf/Button/Button/src/Button at master · bg1bgst333/Sample · GitHub