开发者

Creating ActionEvent object for CustomButton in Java

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开发者_StackOverflow社区] = 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;
}


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);


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜