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;
}
The general idea is:
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:
The
sourceis the object, that fired the event, so in your case, most likely the button. Theididentifies the type of event. Choose on from the static fields atActionEventorAWTEvent. The command is an area where you can put additional information regarding the event.