偽シェル(2)--javaコンソールプログラムのguiへの移植について(1)

詳細を知らない大規模なプログラムを徒手空拳でgui化する件について。

  1. guiレイアウトを別に(SWTとかで)作る。
  2. 動いたguiクラスにThreadを継承させる。
    1. guiクラスのmainをrun()に書き換え。
  3. 移植元のプログラムmainよりguiクラスのコンストラクタを生成
    1. コンストラクタ.start()で別スレッドとして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クラスを実装するしかねえかもなー<<今ここ。


ヘボ過ぎる。