Button上的Java Actionlistener

时间:2014-01-13 13:59:48

标签: java actionlistener

import java.awt.*;

public class TestButton {
  private Frame f;
  protected Button b;

  public TestButton() {
    f = new Frame("Test");
    b = new Button("Press Me!");
    b.setActionCommand("ButtonPressed");
  }

  public void launchFrame() {
    b.addActionListener(new ButtonHandler());
    f.add(b, BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
  }

  public static void main(String args[]) {
    TestButton guiApp = new TestButton();
    guiApp.launchFrame();
  }
}

import java.awt.*;
import java.awt.event.*;

public class ButtonHandler extends TestButton implements ActionListener {
  public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      if(source==b)
      {
            System.out.println("Action occurred");
            System.out.println("Button's command is: "
                               + e.getActionCommand());
      }
  }
}

我正在尝试在按下按钮b但不使用getSource时调用ActionEvent。

3 个答案:

答案 0 :(得分:8)

您滥用继承权。 ButtonHandler类不应扩展TestButton类,因为处理程序类中的b变量引用与显示的完全不同的Button对象。我建议:

  • 使用Swing库,而不是AWT库
  • 您可以从ActionEvent的getSource()方法中按下JButton并直接使用它。
  • 如果您需要在处理程序中引用GUI,请在处理程序的构造函数中传入引用。
  • 不要滥用继承来解决不涉及继承问题的问题。

例如:

import java.awt.event.ActionEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class TestButton extends JPanel {
   private JButton btn = new JButton(new ButtonAction("Press Me!", "ButtonPressed"));

   public TestButton() {
      add(btn);
   }

   private static void createAndShowGUI() {
      TestButton testButton = new TestButton();

      JFrame frame = new JFrame("TestButton");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(testButton  );
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

@SuppressWarnings("serial")
class ButtonAction extends AbstractAction {
   public ButtonAction(String name, String actionCommand) {
      super(name);
      putValue(ACTION_COMMAND_KEY, actionCommand);
   }

   @Override
   public void actionPerformed(ActionEvent evt) {
      System.out.println("Button's actionCommand is: " + evt.getActionCommand());
   }
}

答案 1 :(得分:0)

之所以发生这种情况,是因为您在TestButton中展开了ButtonHandler,因为您有Button的2个不同实例,并且这些实例不等于。

要解决此问题,您可以删除extends TestButton并将ButtonHandler作为TestButton的内部类

或者您可以比较动作命令而不是Button,如下所示:

  if(((Button)source).getActionCommand().equals("ButtonPressed"))

答案 2 :(得分:0)

我认为您需要删除扩展的TestButton,因为按钮的2个不同实例不相等。您应该将ButtonHandler作为内部类或匿名类来实现它。

检查此问题: Java Button Handler