Добавить действие к JButton, созданному другим JButton - PullRequest
1 голос
/ 22 марта 2012

У меня есть кнопка J, которая при нажатии создает еще одну кнопку, и новая кнопка добавляется на панель. Как добавить actionListener к новой кнопке?

Например:

JButton button = new JButton("lala");
button.addActionListener(this);

    public void actionPerformed(ActionEvent event)
      {
        if (event.getSource() == button)
        {
          JButton newButton = new JButton("ahah");
          newButton.addActionListener(this);
        }
       }

Я хочу добавить действие в newButton, как мне это сделать?

РЕДАКТИРОВАННЫЙ КОД:

 public void actionPerformed(ActionEvent event)
  {
  if (event.getSource() == button)
    {
      String name = tfOne.getText();
      Icon flag = new ImageIcon("flag/"+name+".png");
      JButton[] newButton = new JButton[click]; 
      newButton[click-1] = new JButton(name, flag);
      p2.add(newButton[click-1]);
      newButton[click-1].addActionListener(new aListener());
      p2.setLayout(new GridLayout(5+click,1)); //p2 is a panel that has been created
      setSize(500,450+(click*20));

      click++; //number of times the button is pressed
    }
  }

  public class aListener extends MouseAdapter
  { 
    public void mouseClicked(MouseEvent e)
    {
      tfOne.setText("lala");
    }
  }

Код не очень хорошо организован, но это более или менее то, что я хочу сделать

Ответы [ 3 ]

3 голосов
/ 22 марта 2012

Одним из способов было бы иметь внутренний класс, связывающийся со слушателем:

public void actionPerformed(ActionEvent event)
  {
    if (event.getSource() == button)
    {
      JButton newButton = new JButton("ahah");
      newButton.addMouseListener(new yourListener());
    }
   }  

//add this class as a inner class
   public class aListener extends MouseAdapter
   { 
      public void mouseClicked(MouseEvent e)
      {
         JButton buttonReference=(JButton)e.getSource(); // you want this since hardcoding the name of the button is bad if you want listeners for more then one button
         buttonReference.setText("lala");
      }
    }

Это создаст экземпляр yourListener и добавит его к кнопке при ее нажатии

2 голосов
/ 22 марта 2012

Для каждой кнопки вы можете создать свой собственный метод actionPerformed(...), как описано в примере ниже: Вы хотите сделать это:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonAction
{
    private JPanel contentPane;
    private JButton updateButton;
    private int count = 0;
    private ActionListener updateListener = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            final JButton button = new JButton("" +  count); 
            button.setActionCommand("" + count);
            button.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    System.out.println("My COMMAND is : " + event.getActionCommand());
                }
            });
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    contentPane.add(button);
                    contentPane.revalidate();
                    contentPane.repaint();
                }
            });
            count++;
        }
    };

    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("BUTTON ACTIONS");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        contentPane = new JPanel();
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        updateButton = new JButton("UPDATE GUI");
        updateButton.addActionListener(updateListener);

        frame.add(contentPane, BorderLayout.CENTER);
        frame.add(updateButton, BorderLayout.PAGE_END);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                new ButtonAction().createAndDisplayGUI();
            }
        };
        SwingUtilities.invokeLater(runnable);
    }
}
1 голос
/ 22 марта 2012

Для экземпляра newButton должен быть заполнен метод actionPerformed.Я вижу, что к кнопке добавлено ActionListener, но это просто означает, что кто-то перечисляет действия.Код, показанный выше, не определяет никаких действий с этим newButton, поэтому события не запускаются, и ActionListener никогда не получает уведомления ни о чем.

...