Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Arc demonstration

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Arc2D; import java.awt.geom.Rectangle2D; import javax.swing.JApplet; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class ArcApp extends JPanel {   MyCanvas canvas;   JComboBox arcBox, fillBox;   JSlider sliderX, sliderY, sliderWidth, sliderHeight, sliderT0, sliderT;   String[] arcLabels = { "Open", "Chord", "Pie" };   int[] arcTypes = { Arc2D.OPEN, Arc2D.CHORD, Arc2D.PIE };   String[] colorLabels = { "Black", "White", "Red", "Green", "Blue" };   Color[] colors = { Color.black, Color.white, Color.red, Color.green,       Color.blue };   public ArcApp() {     super(new BorderLayout());     canvas = new MyCanvas();         int width = 600;         int height = 55;     sliderX = setSlider(0, width, width / 4, width / 2, width / 4);     sliderY = setSlider(0, height, height / 4,         height / 2, height / 4);     sliderWidth = setSlider(0, width, width / 2, width / 2, width / 4);     sliderHeight = setSlider(0, height, height / 2,         height / 2, height / 4);     sliderT0 = setSlider(0, 360, 45, 180, 45);     sliderT = setSlider(0, 360, 135, 180, 45);     JPanel panel1 = new JPanel();     panel1.setLayout(new GridLayout(3, 3));     panel1.add(new JLabel("Location (x,y): ", JLabel.RIGHT));     panel1.add(sliderX);     panel1.add(sliderY);     panel1.add(new JLabel("Size (w,h): ", JLabel.RIGHT));     panel1.add(sliderWidth);     panel1.add(sliderHeight);     panel1.add(new JLabel("Angles (Th0, Th): ", JLabel.RIGHT));     panel1.add(sliderT0);     panel1.add(sliderT);     add(panel1, BorderLayout.NORTH);     arcBox = new JComboBox(arcLabels);     arcBox.setSelectedIndex(0);     arcBox.setAlignmentX(Component.LEFT_ALIGNMENT);     arcBox.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         JComboBox cb = (JComboBox) e.getSource();         canvas.arcType = arcTypes[cb.getSelectedIndex()];         canvas.repaint();       }     });     fillBox = new JComboBox(colorLabels);     fillBox.setSelectedIndex(0);     fillBox.setAlignmentX(Component.LEFT_ALIGNMENT);     fillBox.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         JComboBox cb = (JComboBox) e.getSource();         canvas.fillColor = colors[cb.getSelectedIndex()];         canvas.repaint();       }     });     JPanel panel2 = new JPanel();     panel2.setLayout(new GridLayout(1, 4));     panel2.add(new JLabel("Arc Type: ", JLabel.RIGHT));     panel2.add(arcBox);     panel2.add(new JLabel("Fill Type: ", JLabel.RIGHT));     panel2.add(fillBox);     add(panel2, BorderLayout.SOUTH);     add(canvas,BorderLayout.CENTER);   }   public JSlider setSlider(int min, int max, int init, int mjrTkSp,       int mnrTkSp) {     JSlider slider = new JSlider(JSlider.HORIZONTAL, min, max, init);     slider.setPaintTicks(true);     slider.setMajorTickSpacing(mjrTkSp);     slider.setMinorTickSpacing(mnrTkSp);     slider.setPaintLabels(true);     slider.addChangeListener(new SliderListener());     return slider;   }   class MyCanvas extends JLabel {     Arc2D arc;     double x, y, w, h, startAngle, extent;      Color fillColor;     int arcType;     Rectangle2D boundingRec = null;     public MyCanvas() {       x = 700 / 4;       y = 550 / 4;       w = 600 / 2;       h = 550 / 2;       startAngle = 0;       extent = 135;        arcType = Arc2D.OPEN;       fillColor = Color.black;       setBackground(Color.white);     }     public void paint(Graphics g) {       Graphics2D g2D = (Graphics2D) g;       g2D.setColor(Color.white);       g2D.fill(new Rectangle(getBounds()));              arc = new Arc2D.Double(x, y, w, h, startAngle, extent, arcType);       if (fillColor == Color.white || arcType == Arc2D.OPEN) {         g2D.setColor(Color.black);         g2D.draw(arc);       } else {         g2D.setColor(fillColor);         g2D.fill(arc);       }       boundingRec = arc.getBounds2D();       drawHighlightSquares(g2D, boundingRec);     }     public void drawHighlightSquares(Graphics2D g2D, Rectangle2D r) {       double x = r.getX();       double y = r.getY();       double w = r.getWidth();       double h = r.getHeight();       g2D.setColor(Color.black);       g2D.fill(new Rectangle.Double(x - 3.0, y - 3.0, 6.0, 6.0));       g2D           .fill(new Rectangle.Double(x + w * 0.5 - 3.0, y - 3.0, 6.0,               6.0));       g2D.fill(new Rectangle.Double(x + w - 3.0, y - 3.0, 6.0, 6.0));       g2D           .fill(new Rectangle.Double(x - 3.0, y + h * 0.5 - 3.0, 6.0,               6.0));       g2D.fill(new Rectangle.Double(x + w - 3.0, y + h * 0.5 - 3.0, 6.0,           6.0));       g2D.fill(new Rectangle.Double(x - 3.0, y + h - 3.0, 6.0, 6.0));       g2D.fill(new Rectangle.Double(x + w * 0.5 - 3.0, y + h - 3.0, 6.0,           6.0));       g2D.fill(new Rectangle.Double(x + w - 3.0, y + h - 3.0, 6.0, 6.0));     }   }   class SliderListener implements ChangeListener {     public void stateChanged(ChangeEvent e) {       JSlider slider = (JSlider) e.getSource();       if (slider == sliderX)         canvas.x = slider.getValue();       else if (slider == sliderY)         canvas.y = slider.getValue();       else if (slider == sliderWidth)         canvas.w = slider.getValue();       else if (slider == sliderHeight)         canvas.h = slider.getValue();       else if (slider == sliderT0)         canvas.startAngle = slider.getValue();       else if (slider == sliderT)         canvas.extent = slider.getValue();       canvas.revalidate();       canvas.repaint();     }   }   public static void main (String[] a){     JFrame f = new JFrame();     f.getContentPane().add(new ArcApp());     f.setDefaultCloseOperation(1);     f.setSize(700, 550);     f.setVisible(true);     } }