/** Let's draw a polygon, and let the user add points, in a similar manner to * how we moved a rectangle to a new x,y position in section 12.2. * The steps we take are inspired by the "how to" section in chapter 10, pp. 414-417. * There is a separate class called Point that's implements an ordered pair. */ import java.util.*; // defines ArrayList import java.applet.*; // defines Applet class import java.awt.*; // defines Graphics[2D] import javax.swing.*; // defines JPanel import java.awt.event.*; // defines ActionListener interface (italics in API) public class PolygonApplet extends Applet { // data should be instance variables of the applet (or panel if we had a panel) // in this case, we want an ArrayList of Point objects. ArrayList vertices; // in applet constructor we need to give the user interface components // Create a panel, and add buttons & text fields to it. public PolygonApplet() { vertices = new ArrayList(); JPanel panel = new JPanel(); // now create text fields and button to add (see RectangleFrame class of prev example) // The text fields are accessed in inner class, so compiler wants them "final" final JTextField xField = new JTextField(5); final JTextField yField = new JTextField(5); JButton addButton = new JButton("Add"); JLabel xLabel = new JLabel("x = "); JLabel yLabel = new JLabel("y = "); // we've already created a panel object, so now "add" into it in order: panel.add(xLabel); panel.add(xField); panel.add(yLabel); panel.add(yField); panel.add(addButton); // listener for the add button class AddPointListener implements ActionListener { public void actionPerformed(ActionEvent e) { int x = Integer.parseInt(xField.getText()); int y = Integer.parseInt(yField.getText()); Point p = new Point(x, y); vertices.add(p); repaint(); // see effect of adding new point w/o waiting for window manager } } ActionListener listener = new AddPointListener(); addButton.addActionListener(listener); JFrame frame = new JFrame(); // do we need the following: // getContentPane().add(panel, BorderLayout.SOUTH); frame.setContentPane(panel); frame.pack(); frame.show(); } // visual representation of data public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; int numPoints = vertices.size(); int [] x = new int[numPoints]; int [] y = new int[numPoints]; for (int i = 0; i < numPoints; ++i) { x[i] = ((Point)vertices.get(i)).getX(); y[i] = ((Point)vertices.get(i)).getY(); } Polygon p = new Polygon(x, y, numPoints); g2.draw(p); } }