如何将不同的actionlisteners添加到同一个对象

时间:2013-03-25 01:43:55

标签: java applet actionlistener calculator japplet

如何向p1对象添加不同的actionlisteners。我希望程序能够在使用适当的按钮按下时将文本栏设置为适当的数字。由于它们不是不同的变量,我不能简单地使用下面的代码(在我的actionPerformed函数中),

if (e.getSource() == button1){ txtField.setText("1"); }

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

public class Telephone extends Applet implements ActionListener
{
   TextField txtField;

   public void init() {
       setLayout(new BorderLayout());

       txtField = new TextField("");
       add(txtField, BorderLayout.NORTH);

       Panel p1 = new Panel();
       p1.setLayout(new GridLayout(4, 3));
       p1.add(new Button("1"));
       p1.add(new Button("2"));
       p1.add(new Button("3"));
       p1.add(new Button("4"));
       p1.add(new Button("5"));
       p1.add(new Button("6"));
       p1.add(new Button("7"));
       p1.add(new Button("8"));
       p1.add(new Button("9"));
       p1.add(new Button("*"));
       p1.add(new Button("0"));
       p1.add(new Button("#"));       
       add(p1, BorderLayout.CENTER);

   }

   public void actionPerformed(ActionEvent e) {


    }
}

1 个答案:

答案 0 :(得分:2)

不要让你的GUI类也是你的监听器类,因为这要求课程做得太多。而是考虑使用匿名内部侦听器类或私有内部类。顺便说一下,我没有看到你在按钮上添加任何监听器的位置。另外,为了我的钱,我创建了一个Swing GUI,而不是AWT GUI,因为Swing更加强大和灵活。

另请注意,对于上面的示例,我实际上会为所有按钮对象提供相同的动作侦听器。如果使用Swing,我可以简单地获取ActionEvent对象的actionCommand,它将是感兴趣的数字String。如果是块或开关块,则不需要10个。

例如,这演示了在JTextField中显示数字的非常简单的逻辑,但没有计算逻辑:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;

public class CalcEg {
   private static final float BTN_FONT_SIZE = 18f;
   private static final String[][] BTN_LABELS = {
      {"7", "8", "9", "-"},
      {"4", "5", "6", "+"},      
      {"1", "2", "3", "/"},
      {"0", ".", "=", "*"}
   };
   private JPanel mainPanel = new JPanel();
   private JTextField textField = new JTextField(10);

   public CalcEg() {
      int rows = BTN_LABELS.length;
      int cols = BTN_LABELS[0].length;
      int gap = 4;

      JPanel buttonPanel = new JPanel(new GridLayout(rows, cols, gap, gap));
      for (String[] btnLabelRow : BTN_LABELS) {
         for (String btnLabel : btnLabelRow) {
            JButton btn = createButton(btnLabel);
            if ("0123456789.".contains(btnLabel)) {
               btn.setAction(new NumberListener(btnLabel));
            } 
            buttonPanel.add(btn);
         }
      }

      textField.setFont(textField.getFont().deriveFont(BTN_FONT_SIZE));

      mainPanel.setLayout(new BorderLayout(gap, gap));
      mainPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
      mainPanel.add(textField, BorderLayout.PAGE_START);
      mainPanel.add(buttonPanel, BorderLayout.CENTER);
   }

   private JButton createButton(String btnLabel) {
      JButton button = new JButton(btnLabel);
      button.setFont(button.getFont().deriveFont(BTN_FONT_SIZE));
      return button;
   }

   public JComponent getMainComponent() {
      return mainPanel;
   }

   private class NumberListener extends AbstractAction {
      NumberListener(String actionCommand) {
         super(actionCommand);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         String actionCommand = e.getActionCommand();
         textField.setText(textField.getText() + actionCommand);
      }
   }

   private static void createAndShowGui() {
      CalcEg mainPanel = new CalcEg();

      JFrame frame = new JFrame("CalcEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel.getMainComponent());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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