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 }