PaintListenerは何故用意されていないんだ
ウォータマークやコピーライトの描画処理のために、共通の描画をGUIの再描画処理に挿し込みたい。.NET WindowFormsコントロールの場合であればこれは簡単でPaintイベントデリゲートにコードをアタッチすれば良いのだが、Swingにはこれに相当するものが無い。もしPaintListener等があれば、
JPanel panel = new JPanel(); panel.addPaintListener( new PaintListener(){ @override public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; //独自の描画処理 } });
てな感じで書けるのに。何故嫌ったんだろう。※
この場合、JPanelを継承したクラスを用意してそのためのリスナを公開すれば無論できるが、継承する位ならばpaintComponentをオーバライドした方がシンプルな訳で、結局は継承するのが前提なのだ。
一応、古い書き方というか、ツールキットからイベントキューを拝借する方法もあるのだが、
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener(){ @Override public void eventDispatched(AWTEvent event) { //任意のコンポーネントとイベントをここで補足 } , AWTEvent.PAINT_EVENT_MASK);
この場合、メソッド内部で対象のイベントとコンポーネントをフィルタする必要があるのと、何よりこのようなグローバルなイベントキューを覗くコードがシステム全体にばら撒かれるのが嫌過ぎる。
※イベントリスナを処理することで当然ながらいくばくかの処理サイクルと時間を消費する。今でこそ全く見劣りしないが、当時のJava-Swingにとっては描画処理のオーバヘッドは少しでも減らしたかったのだろうか。