FileDocCategorySizeDatePackage
CombiningShapes.javaAPI DocExample2392Mon Apr 05 10:07:24 BST 1999None

CombiningShapes.java

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

import javax.swing.*;

public class CombiningShapes
    extends JComponent {
  public static void main(String[] args) {
    ApplicationFrame f = new ApplicationFrame("CombiningShapes v1.0");
    f.add(new CombiningShapes());
    f.setSize(220, 220);
    f.center();
    f.setVisible(true);
  }
  
  private Shape mShapeOne, mShapeTwo;
  private JComboBox mOptions;
  
  public CombiningShapes() {
    // Create the two shapes, a circle and a square.
    mShapeOne = new Ellipse2D.Double(40, 20, 80, 80);
    mShapeTwo = new Rectangle2D.Double(60, 40, 80, 80);
    setBackground(Color.white);
    setLayout(new BorderLayout());
    // Create a panel to hold the combo box.
    JPanel controls = new JPanel();
    // Create the combo box with the names of the area operators.
    mOptions = new JComboBox(
      new String[] { "outline", "add", "intersection",
          "subtract", "exclusive or" }
    );
    // Repaint ourselves when the selection changes.
    mOptions.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent ie) {
        repaint();
      }
    });
    controls.add(mOptions);
    add(controls, BorderLayout.SOUTH);
  }
  
  public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    
    // Retrieve the selection option from the combo box.
    String option = (String)mOptions.getSelectedItem();
    if (option.equals("outline")) {
      // Just draw the outlines and return.
      g2.draw(mShapeOne);
      g2.draw(mShapeTwo);
      return;
    }
    // Create Areas from the shapes.
    Area areaOne = new Area(mShapeOne);
    Area areaTwo = new Area(mShapeTwo);
    // Combine the Areas according to the selected option.
    if (option.equals("add")) areaOne.add(areaTwo);
    else if (option.equals("intersection")) areaOne.intersect(areaTwo);
    else if (option.equals("subtract")) areaOne.subtract(areaTwo);
    else if (option.equals("exclusive or")) areaOne.exclusiveOr(areaTwo);
    
    // Fill the resulting Area.
    g2.setPaint(Color.orange);
    g2.fill(areaOne);
    // Draw the outline of the resulting Area.
    g2.setPaint(Color.black);
    g2.draw(areaOne);
  }
}