DoubleBufferingで自由曲線を描画

編集者:Terai Atsuhiro
作成日:2005-12-19
更新日:2022-08-05 (金) 17:32:59

概要

チラつかないようにDouble Bufferingを行ってパネルにお絵かきします。

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

サンプルコード

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();
  }
});

解説

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

コメント