このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
描画のサンプルとしてはもってこいということで、
簡単なアナログ時計を表示する VNC サーバを作ってみる。
RFBCanvas を使えば、通常の GUI を作るのと同じ感覚で、
RFB サーバとして動作させることができる。
時計の状態は、秒単位で刻一刻と変化するため、
画面の描画は、描画システムの要求があった場合に限らず、
定期的に repaint を呼んで更新を行わなければならない。
ということで、基礎の部分を作ってみよう。
========== ClockCanvas.java ==========
package jp.loafer.rfbdemo;
import java.awt.Graphics2D;
import java.util.Timer;
import java.util.TimerTask;
import jp.loafer.rfb.message.PixelFormat;
import jp.loafer.rfb.server.RFBCanvas;
/**
* ClockCanvas クラス。
* @author kes
*/
public class ClockCanvas extends RFBCanvas {
/**
* {@link ClockCanvas} のインスタンスを作成。
* @param width 画面の幅。
* @param height 画面の高さ。
* @param name 画面の名前。
*/
public ClockCanvas(int width, int height, String name) {
this(width, height, name, null);
}
/**
* {@link ClockCanvas} のインスタンスを作成。
* @param width 画面の幅。
* @param height 画面の高さ。
* @param name 画面の名前。
* @param defaultPixelFormat 画面の既定の画素形式。
*/
public ClockCanvas(int width, int height, String name,
PixelFormat defaultPixelFormat) {
super(width, height, name, defaultPixelFormat);
Timer t = new Timer(true);
t.schedule(new TimerTask() {
@Override
public void run() {
repaint();
}
}, 1000, 1000);
}
/**
* @see RFBCanvas#paint(Graphics2D)
*/
@Override
protected void paint(Graphics2D g) {
// 時計の描画
}
}
========== end of ClockCanvas.java ==========
定期的に repaint を呼ぶためには、
タイマーを作って repaint を呼び出し、
描画システムから update を発生させれば良い。
update は paint を呼び出すため、
特別な処理が不要なら、paint をオーバーライドするだけだ。
さて、RFB ではクライアントの要求がない限り、
サーバから勝手にデータを送る事ができないので、
描画要求に対して RFBCanvas がバッファ処理を行っている。
なので、この辺が正常に動作しているかのテストにもなる。