Mega Code Archive

 
Categories / Java / Advanced Graphics
 

Draw With Layer

import java.awt.*; import java.awt.event.*; import javax.swing.*; import no.geosoft.cc.geometry.Geometry; import no.geosoft.cc.geometry.Matrix4x4; import no.geosoft.cc.graphics.*; /**  * G demo program. Demonstrates:  *  * <ul>  * <li>Positional feature among sibling GObjects.  * <li>Simple selection interaction to choose front object  * <li>Dynamic style changes  * <li>Matrix4x4 for geometry generation  * <li>Text elements and annotation strategy  * <li>Device relative graphic object  * </ul>  *   * @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a>  */    public class Demo2 extends JFrame   implements ActionListener, GInteraction {   private JButton  frontButton_;   private JButton  backButton_;   private JButton  forwardButton_;   private JButton  backwardButton_;   private GScene   scene_;   private GObject  interactionObject_;   private Color    color_;         /**    * Class for creating the demo canvas and hande Swing events.    */      public Demo2()   {     super ("G Graphics Library - Demo 2");     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);          interactionObject_ = null;     color_             = null;          // Create the GUI     JPanel topLevel = new JPanel();     topLevel.setLayout (new BorderLayout());     getContentPane().add (topLevel);             JPanel buttonPanel = new JPanel();     buttonPanel.add (new JLabel ("Click on object to select"));          frontButton_ = new JButton ("Front");     buttonPanel.add (frontButton_);     frontButton_.addActionListener (this);          backButton_ = new JButton ("Back");         buttonPanel.add (backButton_);     backButton_.addActionListener (this);          forwardButton_ = new JButton ("Forward");     buttonPanel.add (forwardButton_);     forwardButton_.addActionListener (this);          backwardButton_ = new JButton ("Backward");         buttonPanel.add (backwardButton_);     backwardButton_.addActionListener (this);          topLevel.add (buttonPanel,   BorderLayout.NORTH);     // Create the graphic canvas     GWindow window = new GWindow();     topLevel.add (window.getCanvas(), BorderLayout.CENTER);         // Create scane with default viewport and world extent settings     scene_ = new GScene (window);     // Create som graphic objects     createGraphics (scene_);     pack();     setSize (new Dimension (500, 500));     setVisible (true);     // Install the selection interaction     window.startInteraction (this);   }      private void createGraphics (GScene scene)   {     int n = 8;     for (int i = 0; i < n; i++) {       Color color = Color.getHSBColor ((float) i / n, (float) 0.5, (float) 1.0);       GObject object = new TestObject ("" + i, 2.0 * i * Math.PI / n, color);       scene.add (object);     }   }   /**    * Handle button interactions.    *     * @param event  Event causing call to this method.    */   public void actionPerformed (ActionEvent event)   {     if (interactionObject_ == null)       return;          Object source = event.getSource();     GObject parent = interactionObject_.getParent();          if (source == frontButton_)       parent.reposition (interactionObject_, parent.front());     else if (source == backButton_)       parent.reposition (interactionObject_, parent.back());                                                             else if (source == forwardButton_)       parent.reposition (interactionObject_, parent.forward());                else if (source == backwardButton_)       parent.reposition (interactionObject_, parent.backward());           frontButton_.setEnabled (!interactionObject_.isInFront());     forwardButton_.setEnabled (!interactionObject_.isInFront());         backButton_.setEnabled (!interactionObject_.isInBack());     backwardButton_.setEnabled (!interactionObject_.isInBack());              interactionObject_.refresh();   }      /**    * Handle graphic events.    *     * @param event  Event type.    * @param x,y    Cursor position.    */   public void event (GScene scene, int event, int x, int y)   {     // We care of button 1 clicks only     if (event == GWindow.BUTTON1_UP) {       GObject object = scene_.find (x, y);       if (object != null) {         if (interactionObject_ != null)           interactionObject_.getStyle().setBackgroundColor (color_);                  interactionObject_ = object;         color_ = interactionObject_.getStyle().getBackgroundColor();         interactionObject_.getStyle().           setBackgroundColor (new Color (255, 255, 255));         object.refresh();       }     }   }         /**    * Defines the geometry and presentation for a sample    * graphic object.    */      private class TestObject extends GObject   {     private double    angle_;  // radians     private GSegment  largeCircle_;     private GSegment  smallCircle_;     private GSegment  arm_;               TestObject (String name, double angle, Color color)     {       angle_ = angle;              GStyle style = new GStyle();       style.setBackgroundColor (color);       style.setLineStyle (GStyle.LINESTYLE_INVISIBLE);       setStyle (style);       largeCircle_ = new GSegment();       addSegment (largeCircle_);       smallCircle_ = new GSegment();       addSegment (smallCircle_);       arm_ = new GSegment();       addSegment (arm_);       GText text = new GText (name, GPosition.MIDDLE | GPosition.CENTER);       GStyle textStyle = new GStyle();       textStyle.setForegroundColor (new Color (100, 100, 100));       textStyle.setBackgroundColor (null);             textStyle.setFont (new Font ("Dialog", Font.BOLD, 36));       text.setStyle (textStyle);       largeCircle_.setText (text);     }          public void draw()     {       // Center of viewport       int x0     = (int) Math.round (getScene().getViewport().getCenterX());       int y0     = (int) Math.round (getScene().getViewport().getCenterY());       int width  = (int) Math.round (getScene().getViewport().getWidth());       int height = (int) Math.round (getScene().getViewport().getHeight());       int length  = Math.min (width, height) - 20;       int qlength = (int) Math.round (length / 3.0);              int[] largeCircleCoord = Geometry.createCircle (x0, y0,                                                       (int) Math.round (length * 0.2));       int[] smallCircleCoord = Geometry.createCircle (x0, y0,                                                       (int) Math.round (length * 0.1));       int[] armCoord = new int[] {x0-qlength, y0-5,                                   x0+qlength, y0-5,                                   x0+qlength, y0+5,                                   x0-qlength, y0+5};       Matrix4x4 matrix = new Matrix4x4();       matrix.translate (-qlength, 0, 0);       matrix.transformXyPoints (smallCircleCoord);       matrix.setIdentity();       matrix.translate (+qlength, 0, 0);       matrix.transformXyPoints (largeCircleCoord);             matrix.setIdentity();       matrix.translate (-x0, -y0);       matrix.rotateZ (angle_);       matrix.translate (+x0, +y0);                    matrix.transformXyPoints (largeCircleCoord);       matrix.transformXyPoints (smallCircleCoord);       matrix.transformXyPoints (armCoord);       largeCircle_.setGeometry (largeCircleCoord);       smallCircle_.setGeometry (smallCircleCoord);       arm_.setGeometry (armCoord);                 }   }      public static void main (String[] args)   {     new Demo2();   } }                     G-DrawWithLayer.zip( 197 k)