• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*DoubleBufferingで自由曲線を描画 [#bc55cccd]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-12-19~
更新日:&lastmod;
---
title: DoubleBufferingで自由曲線を描画
noindex: true
pubdate: 2005-12-19T16:02:40+09:00
---
以前ここに在ったサンプルは修正して、[[JPanelにマウスで自由曲線を描画>Swing/PaintPanel]]に移動しました。

#contents
- `Swing`のコンポーネントでは、自動的に`Double Buffering`が行われる
-- [https://www.oracle.com/java/technologies/painting.html Painting in AWT and Swing]
-- [https://se-ji-cafe.hatenadiary.org/entry/20070306/1173231679 AwtとSwingにおける描画処理 - se-ji-cafe翻訳日記]

**概要 [#mba2e720]
チラつかないようにDouble Bufferingを行ってパネルにお絵かきします。
自前での`Double Buffering`は、[[JComboBoxのモデルとしてenumを使用する>Swing/SortingAnimations]]のアニメーション部分などを参考にしてみてください。

http://terai.xrea.jp/swing/doublebuffering/screenshot.png

**サンプルコード [#cc955806]
 panel = new JPanel() {
   public void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;
     if(offImage!=null) g2.drawImage(offImage, 0, 0, this);
   }
 };
 panel.addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseDragged(MouseEvent e) {
     int x = e.getX();
     int y = e.getY();
     if(offImage==null) {
       Dimension d = panel.getSize();
       int w = d.width;
       int h = d.height;
       offImage = (BufferedImage)createImage(w, h);
     }
     Graphics2D g2d = (Graphics2D)offImage.createGraphics();
     g2d.setStroke(new BasicStroke(3.0F));
     g2d.setPaint(Color.black);
     g2d.drawLine(startX, startY, x, y);
     g2d.dispose();
     startX = x;
     startY = y;
     repaint();
   }
 });
 panel.addMouseListener(new MouseAdapter() {
   public void mousePressed(MouseEvent e) {
     startX = e.getX();
     startY = e.getY();
   }
 });

-[[サンプルを起動>http://terai.xrea.jp/swing/doublebuffering/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/doublebuffering/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/doublebuffering/src.zip]]

**解説 [#t35e18f2]
上記のサンプルでは、マウスリスナを使ってパネル上にお絵かきをしています。この際、チラつかないようにするために、古典的なダブルバッファリングの手法を使っています。

//**参考リンク
**コメント [#p0458ab1]
#comment