简体   繁体   English

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

[英]How to add different actionlisteners to the same object

How do I add different actionlisteners to the p1 objects. 如何向p1对象添加不同的actionlisteners。 I want the program to be able to set the textbar to the appropriate number when pressed with the appropriate button. 我希望程序能够在使用适当的按钮按下时将文本栏设置为适当的数字。 Since they are not different variables I cannot simply use the code below(in my actionPerformed function), 由于它们不是不同的变量,我不能简单地使用下面的代码(在我的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) {


    }
}

Don't have your GUI class also be your listener class as that's asking the class to do too much. 不要让你的GUI类也是你的监听器类,因为这要求课程做得太多。 Instead consider using anonymous inner listener classes or private inner classes. 而是考虑使用匿名内部侦听器类或私有内部类。 Incidentally, I don't see where you're adding any listeners to your buttons. 顺便说一下,我没有看到你在按钮上添加任何监听器的位置。 Also, for my money, I'd create a Swing GUI, not an AWT GUI as Swing is much more robust and flexible. 另外,为了我的钱,我创建了一个Swing GUI,而不是AWT GUI,因为Swing更加强大和灵活。

Also note, for the example above, I would in fact give all my button objects the same action listener. 另请注意,对于上面的示例,我实际上会将所有按钮对象赋予相同的动作侦听器。 If using Swing, I could simply get the ActionEvent object's actionCommand which would be the number String of interest. 如果使用Swing,我可以简单地获取ActionEvent对象的actionCommand,它将是感兴趣的数字String。 No need for 10 if blocks or a switch block. 如果块或开关块则不需要10个。

For example, this demonstrates very simple logic of displaying the number in a JTextField, but has no calculation logic: 例如,这演示了在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();
         }
      });
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM