Java tutorial
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); } }