Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/port80/graph/impl/GraphPanel.java


1   //
2   // Copyright(c) 2002, Chris Leung
3   //
4   
5   package com.port80.graph.impl;
6   
7   import java.awt.*;
8   import java.awt.geom.*;
9   import java.awt.image.*;
10  import java.awt.font.*;
11  import java.util.*;
12  import javax.swing.*;
13  import com.port80.util.*;
14  import com.port80.graph.*;
15  
16  /** Graph panel class.
17   */
18  public class GraphPanel extends JPanel {
19  
20      // Static fields ///////////////////////////////////////////////////////
21      //
22      private static final String NAME = "GraphPanel";
23  
24      // Instance fields /////////////////////////////////////////////////////
25      //
26  
27      IGraph graph = null;
28      Graphics2D graphics2d = null;
29      IGraphRenderer renderer = null;
30      boolean dirty;
31      BufferedImage imageBuffer;
32      double scale = 1.0;
33  
34      // Constructors ////////////////////////////////////////////////////////
35      //
36  
37      public GraphPanel() {}
38      public GraphPanel(IGraph g) {
39          super();
40          setGraph(g);
41          dirty = true;
42      }
43      public GraphPanel(IGraph g, double scale) {
44          super();
45          this.scale = scale;
46          setGraph(g);
47          dirty = true;
48      }
49  
50      // IGraphPanel interface ///////////////////////////////////////////////
51      //
52  
53      public void setGraph(IGraph g) {
54          graph = g;
55          renderer = GraphRendererFactory.getInstance(g);
56          setScale(this.scale);
57          newImageBuffer();
58      }
59      public void setScale(double scale) {
60          this.scale = scale;
61          renderer.setScale(scale);
62      }
63      public void paintComponent(Graphics g) {
64          if (dirty) updateBuffer();
65          Rectangle r = g.getClipBounds();
66          g.clearRect((int)r.getX(), (int)r.getY(), (int)r.getWidth(), (int)r.getHeight());
67          ((Graphics2D)g).drawImage(imageBuffer, new AffineTransform(1f, 0f, 0f, 1f, 0f, 0f), null);
68      }
69  
70      public Graphics2D getGraphics2D() {
71          return graphics2d;
72      }
73      public IGraphRenderer getRenderer() {
74          return renderer;
75      }
76      public BufferedImage getImage() {
77          if (dirty) updateBuffer();
78          return imageBuffer;
79      }
80  
81      ////////////////////////////////////////////////////////////////////////
82  
83      private void newImageBuffer() {
84          Rectangle2D bb = (Rectangle2D)graph.getAttr("bb");
85          double sc = (scale > 0) ? scale : 1.0;
86          int width = (int)(bb.getWidth() * sc) + 1;
87          int height = (int)(bb.getHeight() * sc) + 1;
88          if (bb != null)
89              setPreferredSize(new Dimension(width, height));
90          else
91              setPreferredSize(new Dimension(500, 500));
92          imageBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
93      }
94      private void updateBuffer() {
95          Graphics2D g2d = (Graphics2D)imageBuffer.getGraphics();
96          g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
97          g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
98          g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
99          g2d.setColor(Color.white);
100         g2d.fillRect(0, 0, imageBuffer.getWidth(), imageBuffer.getHeight());
101         renderer.render(g2d, graph);
102         dirty = false;
103     }
104 
105     ////////////////////////////////////////////////////////////////////////
106 
107 }
108