Erstellen ActionEvent-Objekt für CustomButton in Java
Für eine hw-Zuordnung, sollten wir eine benutzerdefinierte Schaltfläche erstellen, um sich mit swing und reagieren auf Ereignisse. Wir waren auch um diese Schaltfläche eine Quelle, die mich verwirrt. Ich habe eine ArrayList, um zu verfolgen die Zuhörer, die würden registrieren zu hören, meine CustomButton. Was bin ich immer verwirrt ist, wie zu Benachrichtigen, die die Zuhörer. Mein Lehrer deutete an, dass eine Benachrichtigung und überschreiben actionPerformed, die ich habe versucht zu tun, aber damals war ich nicht sicher, wie Sie Sie erstellen ein ActionEvent-Objekt suchen, an den Konstruktor-Dokumentation. Die Quelle, id, string alle die mich verwirrt. Jede Hilfe würde geschätzt werden.
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;
}
InformationsquelleAutor Crystal | 2010-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Allgemeine Idee ist:
Sehe ich nicht, die Erklärungen von ActionListener und ActionEvent. Mit Ihrem Muster, der ActionEvent wird wahrscheinlich haben eine Art "Feld" status " steht für den eigentlichen event, also hat Sie einen Konstruktor wie
public ActionEvent(int value)
oder so. Der Hörer erhält den ActionEvent, sieht im inneren des ActionEvent-Objekt, und weiß, warum er gemeldet wurde.BEARBEITEN
Aus anderen Völkern Antwort, die ich gerade gelernt, dass ActionListener und ActionEvent sind AWT-Klassen. Also schauen Sie auf Ihre java-docs, der rest meiner Antwort sollte noch gültig sein.
EDIT 2
Der einfachste Konstruktor ist der hier:
Den
source
ist das Objekt, das ausgelöst das Ereignis, also in deinem Fall höchstwahrscheinlich die-Taste. Dieid
identifiziert den Typ des Ereignisses. Wählen Sie aus den statischen Feldern aufActionEvent
oderAWTEvent
. Der Befehl ist ein Bereich, wo Sie können zusätzliche Informationen über das Ereignis.awt
Paket.InformationsquelleAutor Andreas_D
Lesen Sie die Dokumentation auf ActionEvent. Gibt es einen Abschnitt über seine Konstruktoren, Lesen, was jeder parameter bedeutet.
Für Ihren Fall sein code wird wie folgt Aussehen:
ActionEvent.ACTION_FIRST
?Nein, ich bin mir nicht sicher. Es kommt wohl auf die situation. OP ist die Schaffung seinen eigenen button basiert auf der Verarbeitung von Mausereignissen, so muss er auch gar nicht zu verwenden ActionEvent-Klasse. Er kann seine eigenen mit erforderlichen Qualitäten.
Ich habe versucht, erstellen ein ActionEvent diese Weise mit einem einzigen uniqueID, und einen "" - String, und ich bekomme immer noch eine Fehlermeldung: rivate void notifyListeners() { int uniqueId = 0; ActionEvent event = new ActionEvent(this, uniqueId, ""); for (ActionListener Aktion : listenerList) { action.actionPerfomed(event); } }
Würden Sie nicht haben, um zu überprüfen, dass uniqueId gegen die akzeptablen Grenzen - unbestimmte Verhalten wird verursacht, wenn der id-parameter eines bestimmten ActionEvent Instanz ist nicht im Bereich von ACTION_FIRST zu ACTION_LAST..
InformationsquelleAutor Roman