ソースコードの作成
では、ビューのソースコードを作成しましょう。ビューは、mysampleview.views.SampleView.javaというソースコードファイルとして作成されています。この「SampleView」というクラスが、ビューとして表示されるクラスになるのです。
初期状態で基本的なソースコードは作成されていますので、それを元にして、簡単な表示を作成することにしましょう。今回は、一例として現在の時刻を表示する簡易時計のビューを作ってみます。
package mysampleview.views;
import java.util.*;
import java.text.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.part.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.*;
public class SampleView extends ViewPart {
private Label label;
public SampleView() {
super();
}
// タイマーの実行メソッド
public void doTimer(boolean f) {
final boolean flag = f;
Runnable runnable = new Runnable() {
public void run() {
Display.getDefault().timerExec(500,
new InnerTimerThread(flag));
};
};
runnable.run();
}
// タイマー内で使われる内部スレッドクラス
class InnerTimerThread implements Runnable {
boolean f;
public InnerTimerThread(boolean f) {
super();
this.f = f;
}
public void run() {
String delim = f ? ":" : " ";
f = !f;
String str = "hh" + delim + "mm" + delim + "ss";
SimpleDateFormat sf = new SimpleDateFormat(str);
GregorianCalendar cal = new GregorianCalendar();
String s = sf.format(cal.getTime());
label.setText(s);
doTimer(f);
}
}
// ビューの表示を作成するメソッド
public void createPartControl(Composite parent) {
label = new Label(parent, SWT.NONE);
Font f = new Font(Display.getCurrent(), "Impact",
24, SWT.NORMAL);
label.setFont(f);
label.setText("My Timer");
doTimer(true);
}
// フォーカスされた際の処理メソッド
public void setFocus() {
// 特に何もしない
}
}
ビューのクラスは、「org.eclipse.ui.part.ViewPart」というクラスを継承して作成します。ここには、2つの重要なメソッドが要されます。
public void createPartControl(Composite parent)
ここでビューに表示するコンポーネントの組み込みなどが行なわれます。引数に渡されるorg.eclipse.swt.widgets.Compositeがビューに表示されるコンテナ部分となっており、ここにSWTのウィジェットを追加していくことでGUIを作成できます。
public void setFocus()
フォーカスが移動したときの処理を用意します。今回は特に何もしていませんが、実際に組み込んであるコンポーネントなどをフォーカスする処理などをここに用意します。
ここまでざっと見て、いくつか気がついたことがあるでしょう。その最大のものは「ビューは、SWTで作られる」という点です。「SWT」というのは「Standard Widget Toolkit」の略で、Eclipse Foundationが独自に開発したGUIフレームワークです。Eclipseは、実はこのSWTを使って作られているのです。ですから、ビューもやはりSWTで作る必要があります。
さて、このSWTに関係するのですが、今回はスレッドを使って一定時間ごとに時刻を表示させているため、組み込みがちょっと面倒なことになっています。doTimerメソッドの中でRunnableを作成し、そのrun内でInnerTimerThreadインスタンスを作りスレッドを実行しています。なんでこんなわけのわからないことをしているんだ、思ったことでしょう。
SWTは、かなりネイティブな環境に依存したフレームワークです。表示など多くの部分がネイティブ環境の機能をそのまま呼び出して動くようになっています。その関係で、SWTの部品を操作する場合、Javaの(メインスレッド以外の)スレッドからはアクセスできないのです。これを行なうには、DisplayインスタンスというものにあるtimerExecというメソッドを使い、スレッドをSWT側のタイマーに登録して呼び出してやる必要があります。このため、ここであげているような面倒なやりかたを行なう必要があるのです。
まぁ、こうしたSWT特有の処理については、ここでは深く触れません。ここではスレッドが必要だったのでちょっと面倒になりますが、単純な表示をするだけのビューなら、もっとシンプルに作れるでしょう。