Создание объекта ActionEvent для CustomButton в Java - PullRequest
1 голос
/ 27 мая 2010

Для задания hw мы должны были создать пользовательскую кнопку, чтобы познакомиться с свингом и реагировать на события. Мы также должны были сделать эту кнопку источником событий, который смущает меня. У меня есть ArrayList для отслеживания слушателей, которые будут регистрироваться для прослушивания моей CustomButton. Что меня смущает, так это как уведомить слушателей. Мой учитель намекнул на наличие уведомляющего и переопределяющего actionPerformed, которое я пытался сделать, но потом я не был уверен, как создать объект ActionEvent, просматривая документацию конструктора. Источник, id, string все меня смущает. Любая помощь будет оценена.

код:

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

Ответы [ 2 ]

1 голос
/ 27 мая 2010

Общая идея:

  • У вас есть коллекция слушателей.
  • Если вам нужно уведомить слушателей (событие произошло), вы перебираете коллекцию слушателей и вызываете соответствующий метод для каждого слушателя (ActionListener в вашем случае).

Я не вижу объявлений ActionListener и ActionEvent. С вашим шаблоном ActionEvent, скорее всего, будет иметь своего рода поле состояния, которое представляет фактическое событие, поэтому он имеет конструктор, такой как public ActionEvent(int value) или около того. Слушатель получает ActionEvent, заглядывает внутрь объекта ActionEvent и теперь выясняет, почему он был уведомлен.

EDIT

От ответа других людей я только что узнал, что ActionListener и ActionEvent являются классами AWT. Посмотрите на их документы по Java, остальная часть моего ответа должна быть действительной.

РЕДАКТИРОВАТЬ 2

Самый простой конструктор:

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

source - это объект, который вызвал событие, поэтому в вашем случае, скорее всего, кнопка. id указывает тип события. Выберите из статических полей на ActionEvent или AWTEvent. Команда - это область, в которую вы можете поместить дополнительную информацию о событии.

1 голос
/ 27 мая 2010

Прочитать документацию по ActionEvent .Есть раздел о его конструкторах, прочитайте, что означает каждый параметр.

Для вашего случая применимый код будет выглядеть так:

...