如何将不同的动作侦听器添加到同一对象 [英] How to add different actionlisteners to the same object

查看:26
本文介绍了如何将不同的动作侦听器添加到同一对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How do I add different actionlisteners to the p1 objects. 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),

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) {


    }
}

推荐答案

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

Don't have your GUI class also be your listener class as that's asking the class to do too much. 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,我可以简单地获取 ActionEvent 对象的 actionCommand,这将是感兴趣的数字字符串.不需要 10 个 if 块或 switch 块.

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. No need for 10 if blocks or a switch block.

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

For example, this demonstrates very simple logic of displaying the number in a JTextField, but has no calculation logic:

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

这篇关于如何将不同的动作侦听器添加到同一对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆