投稿

[JavaFX] WebView関連のTIPS

JavaFXのWebView、こいつは使えるかもしれないぜ。。 右クリックのメニュー(Context Menu)を出なくする webView.contextMenuEnabledProperty().setValue(false); Javaから好きなスクリプトを実行する(またはwindowオブジェクトを取得) JSObject obj = (JSObject)webView.getEngine().executeScript("window"); window.openでポップアップを出なくする webView.getEngine().setCreatePopupHandler( new Callback<PopupFeatures,WebEngine>() { @Override public WebEngine call(PopupFeatures arg0) { return null; } }); 全てのAタグを取得する Document doc = webView.getEngine().getDocument(); NodeList nodeList = doc.getElementsByTagName("a"); 上で取得したElementにclickリスナーを貼る for (int i = 0; i < nodeList.getLength(); i++) { EventTarget t = (EventTarget) nodeList.item(i); t.addEventListener("click", listener, false); } 上で貼るリスナーの実装 EventListener listener = new EventListener() { @Override public void handleEvent(Event evt) { String domEventType = evt.getType(); if (domEventType.equals("click")) { Element el = (Element)evt.getCurrent...

[Dart] web_ui : bind色々

下記の変数を設定した時のサンプル @observable String  data テキスト入力・・・type="text" <input type="text" bind-value="data"> チェックボックス・・・type="checkbox" <input type="checkbox" bind-checked="isChecked"> ※isCheckedはboolの変数。もちろん@observableが必要。 select <select bind-value="data">   <option value="one" selected="{{ data=='one' }}">その1</option>   <option value="two" selected="{{ data=='two' }}">その2</option> </select> なにかと面倒なselect。bind-valueでOKだが、各選択肢のselectedを工夫する必要あり。ちなみにこれは同時にひとつしか選択できない場合のみ有効。

[Dart] web_ui : observableとかbindとか

Dartのweb_ui、まさに最新のwebアプリの作り方という感じだ。 bindやobservableで、なんだか知らないけど変数を変更しただけで 表示が更新されてくれて、超便利! だが、実際ちょっとやってみると、「なんだか知らないけど」レベルではマズイ。 というわけでTopicをまとめてみた。 {{ }}とは html側に埋め込む。{{ }}で囲まれている式の返り値のtoString()が、そこに表示される文字列となる。 但し、ここで使われている変数に「@observable」を付けないと、変数を変更しても即座に反映されない。 @observableとは dart側に使う。変数に対して付ける。 これを付けられた変数は、以降、「変更」されると再描画が走るようになる。 変数を「変更」するとは 「変更」とはインスタンスの変更である。同じインスタンスでは、その中身をいくら変更しても変更とはならない。 @observable List  a = []; とした時、 a = ["hoge"]; とすれば再描画される。 が、 a.add("hoge"); とやっても再描画されない。(実はこの時に再描画を行う方法がある) ところで、ここで言っている「再描画」とは、htmlに埋め込まれたinstantiateや{{ }}が再評価され、最新の状態が画面に反映されることである。 toObservable()とは 上記で、a.add("hoge")では再描画されないとしたが、往々にして、こういう時再描画してほしい。 でも、再描画させたいからといってListを作りなおすのはバカらしい。 ということで用意されたのがtoObservable()。 下記のように、toObservableでインスタンスをラップする事で、強制的に再描画を起こさせる。 a.add("hoge");  // ここでは再描画しない a = toObservable(a);  // ここで再描画する ちなみに、toObservableはMap,Set,Iterable専用らしい。 instantiateとは html側に使用する。templateタ...

ShiftJIS

■ShiftJISについて 2バイト文字の第1バイト 0x81~0x9Fの30個 (2進数では1000_0001~1001_1111) 0xE0~0xFCの29個 (1110_0000~1111_1100) 2バイト文字の第2バイト 0x40~0x7E (0100_0000~0111_1110) 0x80~0xFC (1000_0000~1111_1100) 半角カナ 0xA1~0xDF (1010_0001~1101_1111) ■文字コード表 Shift-JIS http://www.seiai.ed.jp/sys/text/java/shiftjis_table.html ユニコード http://www.tamasoft.co.jp/ja/general-info/unicode.html

[Dart]Stream.listenに2重のリスナ

DartのStreamのリスナ管理の話 Stream.listenを使ってリスナを貼るのだが、やればやるほどリスナが貼られていくよね。 new ButtonElement() ..onClick.listen( ()=> print("hoge") ) ..onClick.listen( ()=> print("hoge") ); 結果 >hoge >hoge これは、onClick呼び出し内でStream<T>がnewされるためだ。(EventStreamProvider.forTargetを内部で呼んでいる) そして、listen()でさらにStreamSubscription<T>がnewされている。 実際にリスナを持つのは、このStreamSubscriptionで、こいつはリスナを一つしか持てない。 ということは、リスナは追加ではなく差し替えにしたい場合、こいつのonDataを書き換えてやれば良いわけだ。 ちなみに、StreamSubscription.cancel()を呼び出すことで、それ以降のイベントの配信を停止できる。 下のソースは、クリックされるたびにTextを変更し、2回目のクリックでそれ以降のイベントの受信を停止するサンプルだ。 ButtonElement btn = new ButtonElement(); StreamSubscription<Event>  s = btn. onClick .listen( null ); s.onData( ( e ) {   btn. text = "first click" ;   s.onData( ( e ) { btn. text = "second click" ;s.cancel(); } ); } ); 参考: Getting Your Feet Wet with Streams

[Dart]Streamを返す関数

例えばElementのonClickなど、Streamを返す関数はDartの標準ライブラリに多数存在する。 というわけで、自分もStreamを返す関数を作りたい。 以下、サンプル。 StreamController<String> cont = new StreamController(); Stream<String> get onReceive => cont.stream; void update() { HttpRequest.request("http://...../data") .then( (HttpRequest req) { cont.add(req.responseText); if( isFinish ) // 終了フラグ cont.close(); }) .catchError( (e) { cont.addError(e); }); } キモはStreamControllerだ。 addメソッドでデータを送り、終了したらcloseメソッドでストリームを閉じる。 エラーはaddErrorメソッドで通知。 ちなみに、このサンプルでデータ取得ハンドラを貼るには下記のようにする。 a.onReceive.listen( (String data) => print(data) ); ※上記サンプルがクラスとして定義されて変数aになっているとする。

[Dart]Futureを返す関数

Dartで標準で用意されているメソッドはFutureを返すものがある。 これは遅延を伴う処理を、無駄なく行うための重要な機構だ。 というわけで自分のメソッドもFutureを返すようにしたいのだが、 そのやり方は下記の通り。 Future<chartdata> httpAccessTest() { Completer comp = new Completer(); HttpRequest.request("http://..../xxx") .then( (HttpRequest req) { // 成功した時 comp.complete(req.responseText); }) .catchError( (e) => comp.completeError(e) ); // 失敗した時 return comp.future; } これはhttpでデータを取得するサンプルだ。 Completerオブジェクトを使用するのがミソ。 っていうか、それしかないが。 正常終了の結果はcompleteメソッドで通知。 エラーは、completeErrorメソッドを使用して通知。サンプルでは元の処理でThrowされているものをそのまま転送している。 ちなみに、Completerが使えるのは一回こっきりだ。使い回しはできない。 Futureの使い方 http://www.dartlang.org/articles/using-future-based-apis/ Futureのエラーハンドリング方法 http://www.dartlang.org/articles/futures-and-error-handling/