在 Java 中为 CustomButton 创建 ActionEvent 对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2919828/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Creating ActionEvent object for CustomButton in Java
提问by Crystal
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.
对于硬件分配,我们应该创建一个自定义按钮来熟悉摆动和响应事件。我们还要让这个按钮成为一个让我感到困惑的事件源。我有一个 ArrayList 来跟踪将注册收听我的 CustomButton 的侦听器。我感到困惑的是如何通知听众。我的老师暗示有一个我尝试过的通知和覆盖 actionPerformed ,但后来我不确定如何创建一个 ActionEvent 对象,查看构造函数文档。来源、id、字符串都让我感到困惑。任何帮助,将不胜感激。
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;
}
采纳答案by Andreas Dolk
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).
- 您维护一组侦听器。
- 如果您必须通知侦听器(发生事件),则遍历侦听器集合并在每个侦听器(在您的情况下为 ActionListener)上调用适当的方法。
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.
我没有看到 ActionListener 和 ActionEvent 的声明。对于您的模式, ActionEvent 很可能会有一种代表实际事件的状态字段,因此它具有类似的构造函数public ActionEvent(int value)。侦听器接收到 ActionEvent,查看 ActionEvent 对象的内部,然后了解为什么他会收到通知。
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.
从其他人的回答中,我刚刚了解到 ActionListener 和 ActionEvent 是 AWT 类。所以看看他们的java文档,我的其余答案应该仍然有效。
EDIT 2
编辑 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 ididentifies the type of event. Choose on from the static fields at ActionEventor AWTEvent. The command is an area where you can put additional information regarding the event.
该source是对象,触发事件,那么在你的情况下,最有可能的按钮。的id识别事件的类型。从ActionEvent或的静态字段中选择AWTEvent。命令是一个区域,您可以在其中放置有关事件的附加信息。
回答by Roman
Read documentation on ActionEvent. There is a section about its constructors, read what each parameter means.
阅读有关ActionEvent 的文档。有一节是关于它的构造函数的,请阅读每个参数的含义。
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);

