001 package org.shiftone.jrat.provider.tree.ui.trace.graph; 002 003 004 import org.shiftone.jrat.util.log.Logger; 005 006 import javax.swing.*; 007 import java.awt.*; 008 009 010 public abstract class BufferedJComponent extends JComponent { 011 012 private static final Logger LOG = Logger.getLogger(BufferedJComponent.class); 013 private int bufferWidth; 014 private int bufferHeight; 015 private Image bufferImage; 016 private Graphics2D bufferGraphics; 017 018 public void dataChanged() { 019 destroyBuffer(); 020 } 021 022 023 public void paint(Graphics g) { 024 if ((bufferWidth != getSize().width) || (bufferHeight != getSize().height) || (bufferImage == null) 025 || (bufferGraphics == null)) { 026 createBuffer(); 027 paintBuffer(bufferGraphics); 028 } 029 030 if (bufferGraphics != null) { 031 g.drawImage(bufferImage, 0, 0, this); 032 } 033 } 034 035 036 private void destroyBuffer() { 037 038 if (bufferGraphics != null) { 039 bufferGraphics.dispose(); 040 041 bufferGraphics = null; 042 } 043 044 if (bufferImage != null) { 045 bufferImage.flush(); 046 047 bufferImage = null; 048 } 049 } 050 051 052 private void createBuffer() { 053 054 LOG.debug("resetBuffer"); 055 056 bufferWidth = getSize().width; 057 bufferHeight = getSize().height; 058 059 destroyBuffer(); 060 061 bufferImage = createImage(bufferWidth, bufferHeight); 062 bufferGraphics = (Graphics2D) bufferImage.getGraphics(); 063 } 064 065 066 protected abstract void paintBuffer(Graphics2D g); 067 }