偽シェル(2)--javaコンソールプログラムのguiへの移植について(1)
詳細を知らない大規模なプログラムを徒手空拳でgui化する件について。
- guiレイアウトを別に(SWTとかで)作る。
- 動いたguiクラスにThreadを継承させる。
- guiクラスのmainをrun()に書き換え。
- 移植元のプログラムmainよりguiクラスのコンストラクタを生成
これで元のプログラムもgui部分もどっちも動作した。
id:COPも作業やってるようだし、風邪引いたとか言ってらんねえよ!
後は元のプログラムにあるprintstreamを弄って
swtのウィジェットにsetText等で設置してやれば偽シェルは一応完成する予定・・・。
でも、なんかまたどうでも良いところで引っかかりそうな予感。
かろうじて動き始めた。
swtへの値の変更のためには、display.async内でrun(スレッド化)してやらなければならない。らしい。
とは言っても全然理解できてないので、とりあえずめちゃくちゃやったら何とか動いた。
めちゃくちゃやったコードは以下。
private class SwtPrint extends PrintStream { MySWT swt; String mystr =""; SwtPrint(MySWT swt) { super(System.out); this.swt = swt; } public void print(String s) { super.print(s); mystr = s; Display display = swt.getDisplay(); display.asyncExec(new Runnable() { public void run() { swt.setText(swt.getText() + mystr); } }); } }
めちゃくちゃやっただけなので、どんな影響が出るか分かったものではない・・・。
(追記2)
うーむ。どうしてもコンソール入力のhookについてうまい方法が思いつかん。
最初に考えたのは、System.inに文字列が流し込む方法を考えたんだけど、やり方が分からん。
次にはBufferedReader継承させた自前のクラスのreadLine()メソッドで任意のstringを返してやって
やろうかと思ったけど、
readLineの呼ばれるタイミングは結局System.in次第なので思ったような動作をしない。
いい加減ネタが尽きたので、結局潔くshellクラスを実装するしかねえかもなー<<今ここ。
ヘボ過ぎる。