title: Creating ActionEvent object for CustomButton in Java
body: <p>For a hw assignment, we were supposed to create a custom button to get familiar with swing and responding to events.  We were also to make this button an event source which confuses me.  I have an ArrayList to keep track of listeners that would register to listen to my CustomButton.  What I am getting confused on is how to notify the listeners.  My teacher hinted at having a notify and overriding actionPerformed which I tried doing, but then I wasn't sure how to create an ActionEvent object looking at the constructor documentation.  The source, id, string all confuses me.  Any help would be appreciated. </p>
  
  <p>code:</p>
  
  <pre><code>import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import java.util.List;
  import java.util.ArrayList;
  
  public class CustomButton 
  {
      public static void main(String[] args)
      {
          EventQueue.invokeLater(new Runnable()
          {
              public void run()
              {
                  CustomButtonFrame frame = new CustomButtonFrame();
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.setVisible(true);
              }
          });
      }
  
      public void addActionListener(ActionListener al)
      {
          listenerList.add(al);
      }
  
      public void removeActionListener(ActionListener al)
      {
          listenerList.remove(al);
      }
  
      public void actionPerformed(ActionEvent e) 
      {
          System.out.println("Button Clicked!");
      }
  
      private void notifyListeners()
      {
          ActionEvent event = new ActionEvent(CONFUSED HERE!!!!;
          for (ActionListener action : listenerList) {
              action.actionPerfomed(event);
          }
      }
  
      List&lt;ActionListener&gt; listenerList = new ArrayList&lt;ActionListener&gt;();
  }
  
  class CustomButtonFrame extends JFrame
  {
      // constructor for CustomButtonFrame
      public CustomButtonFrame()
      {
          setTitle("Custom Button");
          CustomButtonSetup buttonSetup = new CustomButtonSetup();
          this.add(buttonSetup);
          this.pack();
      }
  }
  
  class CustomButtonSetup extends JComponent 
  {
      public CustomButtonSetup()
      {
          ButtonAction buttonClicked = new ButtonAction();
          this.addMouseListener(buttonClicked);
      }
  
      // because frame includes borders and insets, use this method
      public Dimension getPreferredSize()
      {
          return new Dimension(200, 200);
      }
  
      public void paintComponent(Graphics g)
      {
          Graphics2D g2 = (Graphics2D) g;
  
          // first triangle coords
          int x[] = new int[TRIANGLE_SIDES];
          int y[] = new int[TRIANGLE_SIDES];
          x[0] = 0;   y[0] = 0;
          x[1] = 200; y[1] = 0;
          x[2] = 0;   y[2] = 200;
          Polygon firstTriangle = new Polygon(x, y, TRIANGLE_SIDES);
  
          // second triangle coords
          x[0] = 0;   y[0] = 200;     
          x[1] = 200; y[1] = 200;
          x[2] = 200; y[2] = 0;
          Polygon secondTriangle = new Polygon(x, y, TRIANGLE_SIDES);
  
          g2.drawPolygon(firstTriangle);
          g2.setColor(firstColor);
          g2.fillPolygon(firstTriangle);
  
          g2.drawPolygon(secondTriangle);
          g2.setColor(secondColor);
          g2.fillPolygon(secondTriangle);
  
          // draw rectangle 10 pixels off border
          int s1[] = new int[RECT_SIDES];
          int s2[] = new int[RECT_SIDES];
          s1[0] = 5;    s2[0] = 5;
          s1[1] = 195;  s2[1] = 5;
          s1[2] = 195;  s2[2] = 195;
          s1[3] = 5;    s2[3] = 195;
          Polygon rectangle = new Polygon(s1, s2, RECT_SIDES);
          g2.drawPolygon(rectangle);
          g2.setColor(thirdColor);
          g2.fillPolygon(rectangle);  
      }
  
      private class ButtonAction implements MouseListener {
          public void mousePressed(MouseEvent e)
          {
              System.out.println("Click!");
              firstColor = Color.GRAY;
              secondColor = Color.WHITE;
  
              repaint();
          }
  
          public void mouseReleased(MouseEvent e)
          {
              System.out.println("Released!");
              firstColor = Color.WHITE;
              secondColor = Color.GRAY;
              repaint();
          }
  
          public void mouseEntered(MouseEvent e)
          {}
  
          public void mouseExited(MouseEvent e)
          {}
  
          public void mouseClicked(MouseEvent e)
          {}
      }
  
      public static final int TRIANGLE_SIDES = 3;
      public static final int RECT_SIDES = 4;
      private Color firstColor = Color.WHITE;
      private Color secondColor = Color.DARK_GRAY;
      private Color thirdColor = Color.LIGHT_GRAY;
  }
  </code></pre>