Creating ActionEvent object for CustomButton in Java

18,679

Solution 1

The general idea is:

  • You maintain a collection of listeners.
  • If you have to notify the listeners (an event occured), you iterate through the collection of listeners and call the appropriate method on each Listener (ActionListener in your case).

I don't see the declarations of ActionListener and ActionEvent. With your pattern, the ActionEvent most likely will have a sort of status field which represents the actual event, so it has a constructor like public ActionEvent(int value) or so. The listener receives the ActionEvent, looks inside the ActionEvent object and nows, why he has been notified.

EDIT

From other peoples answer I just learned that ActionListener and ActionEvent are AWT classes. So look at their java docs, the rest of my answer should still be valid.

EDIT 2

The easiest constructor is this one:

public ActionEvent(Object source, int id, String command);

The sourceis the object, that fired the event, so in your case, most likely the button. The id identifies the type of event. Choose on from the static fields at ActionEvent or AWTEvent. The command is an area where you can put additional information regarding the event.

Solution 2

Read documentation on ActionEvent. There is a section about its constructors, read what each parameter means.

For your case appliable code will be like this:

int uniqueId = System.currentTimeMillis().intValue();
String commandName = ""; //it can be like "show" or "hide" or whatever else; 
                         //you can get this string with getActionCommand() method
                         //and make some actions based on its value
                         //... but you don't need it now
ActionEvent event = new ActionEvent(this, uniqueId, commandName);
Share:
18,679
Crystal
Author by

Crystal

Updated on June 05, 2022

Comments

  • Crystal
    Crystal almost 2 years

    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.

    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<ActionListener> listenerList = new ArrayList<ActionListener>();
    }
    
    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;
    }
    
  • Andreas Dolk
    Andreas Dolk almost 14 years
    Are you sure about the uniqueId? Don't you have to use any of the defined id's like ActionEvent.ACTION_FIRST?
  • Roman
    Roman almost 14 years
    @Andreas_D: no, I'm not sure. It probably depends on situation. OP is creating his own button based on handling mouse events so he doesn't even need to use ActionEvent class. He can create his own one with necessary qualities.
  • Crystal
    Crystal almost 14 years
    I tried creating an ActionEvent this way, with a single uniqueID, and a "" String, and I still get an error: rivate void notifyListeners() { int uniqueId = 0; ActionEvent event = new ActionEvent(this, uniqueId, ""); for (ActionListener action : listenerList) { action.actionPerfomed(event); } }
  • ChiefTwoPencils
    ChiefTwoPencils about 9 years