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    }