2010-05-27 10 views
1

Pour une affectation de type hw, nous devions créer un bouton personnalisé afin de nous familiariser avec swing et de répondre aux événements. Nous devions aussi faire de ce bouton une source d'événement qui me déroute. J'ai une ArrayList pour garder une trace des écouteurs qui s'inscriraient pour écouter mon CustomButton. Ce que je suis confus est comment notifier les auditeurs. Mon professeur a suggéré d'avoir une notification et une action prioritaire que j'ai essayé de faire, mais je ne savais pas comment créer un objet ActionEvent en regardant la documentation du constructeur. La source, id, chaîne tout me confond. Toute aide serait appréciée.Création d'un objet ActionEvent pour CustomButton en Java

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

Répondre

1

L'idée générale est:

  • Vous entretenez une collection d'auditeurs.
  • Si vous devez avertir les écouteurs (un événement s'est produit), parcourez la collection d'écouteurs et appelez la méthode appropriée sur chaque écouteur (ActionListener dans votre cas).

Je ne vois pas les déclarations de ActionListener et ActionEvent. Avec votre pattern, l'ActionEvent aura probablement une sorte de champ d'état qui représente l'événement réel, donc il a un constructeur comme public ActionEvent(int value) ou plus. L'écouteur reçoit l'ActionEvent, regarde à l'intérieur de l'objet ActionEvent et s'incline, pourquoi il a été averti.

EDIT

des autres peuples réponse que je viens d'apprendre que ActionListener et ActionEvent sont des classes AWT. Alors regardez leurs docs java, le reste de ma réponse devrait toujours être valide.

EDIT 2

Le constructeur le plus simple est celle-ci:

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

Le source est l'objet, qui a déclenché l'événement, donc dans votre cas, très probablement sur le bouton. Le id identifie le type d'événement. Choisissez dans les champs statiques au ActionEvent ou AWTEvent. La commande est une zone dans laquelle vous pouvez ajouter des informations supplémentaires concernant l'événement.

+0

ActionEvent est une classe standard du paquet 'awt'. – Roman

1

documentation Lire sur ActionEvent. Il y a une section sur ses constructeurs, lisez ce que chaque paramètre signifie.

Pour votre cas, le code appliable sera comme ceci:

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

Etes-vous sûr de l'ID unique? N'avez-vous pas besoin d'utiliser l'un des ID définis comme ActionEvent.ACTION_FIRST'? –

+0

@Andreas_D: non, je ne suis pas sûr. Cela dépend probablement de la situation. OP crée son propre bouton basé sur la gestion des événements de la souris afin qu'il n'ait même pas besoin d'utiliser la classe ActionEvent. Il peut créer son propre avec les qualités nécessaires.Je – Roman

+0

essayé de créer un ActionEvent de cette façon, avec un seul uniqueID, et un "" String, et je reçois encore une erreur: notifyListeners vide) (PRIV \t { \t \t int uniqueId = 0; \t \t ActionEvent event = new ActionEvent (this, uniqueId, ""); Pour (ActionListener action: listenerList) { \t \t \t action.actionPerfomed (événement); \t \t \t} \t} – Crystal