repaint()の説明を読むと描画の際にクリアされるとあります。 そこで初回とそれ以降でpaint()の挙動を変えて確認しました。
import java.awt.*; import java.awt.event.*; class MyFrame extends Frame { public static void main(String args[]) { new MyFrame().setVisible(true); } MyFrame() { setSize(100, 100); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); add(new MyComponent()); } } class MyComponent extends Component { public MyComponent() { enableEvents(AWTEvent.MOUSE_EVENT_MASK); } private boolean first = true; public void paint(Graphics g) { Rectangle r = g.getClipBounds(); if (first) { g.setColor(Color.RED); g.fillRect(r.x, r.y, r.width, r.height); first = false; } else { g.drawRect(r.x, r.y, r.width - 1, r.height - 1); } } protected void processMouseEvent(MouseEvent e) { super.processMouseEvent(e); if (e.getID() == MouseEvent.MOUSE_CLICKED) { repaint(20, 20, 40, 20); } } }
確かにrepaint()では背景がクリアされています。
paint()で毎回全描画するようなアルゴリズムの場合、 パラメータを変化させることで動きを表現するのには、 クリアされている方が都合が良いということでしょう。
ライトウェイトではpaint()を呼ぶのと同じなので、 単なる追加描画になるはずです。
protected void processMouseEvent(MouseEvent e) { super.processMouseEvent(e); if (e.getID() == MouseEvent.MOUSE_CLICKED) { Graphics g = getGraphics(); g.setClip(20, 20, 40, 20); update(g); g.dispose(); } }
予想通りでした。
自前でGraphicsを調整してupdate()を呼ぶ意味は、 ほとんどないような印象です。 通常はrepaint()だけを考慮すれば良さそうです。
コメントはありません。 コメント/GUIサーバ高速化/05.部分描画実装(libbaygui)/実装/AWT/04?