简体   繁体   English

actionlistener回调到另一个类

[英]actionlistener callback to another class

I have a class LabelTextField which does as it indicates, it create a label followed by text field. 我有一个LabelTextField类,如它所示,它创建一个标签,后跟文本字段。 I want this class to act as JTextField does, ie responding to actionPerformed when an action listener is added. 我希望这个类充当JTextField,即在添加动作侦听器时响应actionPerformed。 I am adding an action listener with LabelTextField so the JTextField in this class will need to receive the callback and forward on the LabelTextField object name and not the JTextField object name. 我正在使用LabelTextField添加一个动作侦听器,因此该类中的JTextField需要在LabelTextField对象名而不是JTextField对象名上接收回调和转发。

I have show a simple JTextField and how it works, the LabelTextField is also there and how I expect to use it. 我已经展示了一个简单的JTextField以及它是如何工作的,LabelTextField也在那里以及我希望如何使用它。

I have provided a code snippet of what I want to do. 我提供了我想要做的代码片段。

I am having trouble with this type of callback and detail information would be useful. 我遇到这种类型的回调有问题,详细信息会很有用。

// //

class C_one extends JPanel
{

       private JTextField      mjtfOne;
       private LabelTextField  m_nameFind;

       public C_one ()
       {
          setLayout(new FlowLayout());

          mjtfOne = new JTextField(20);
          mjtfOne.addActionListener(this);

          m_nameFind = new LabelTextField("Name", 20);
          m_nameFind.addActionListener(this);

          add(mjtfOne);
          add(m_nameFind);

       }

       // This is called when return is pressed in either object.
       public void actionPerformed(ActionEvent ae) 
       {
          // This works.
          if (ae.getSource() == mjbnOne) {
             System.out.println("Text field one!");

          // ****** This doesn't work. *****
          } else if (ae.getSource() == m_nameFind) {
             System.out.println("Label Text Field name");
          }
       }

}

// // This create a label and textfield as a widget. // //这会创建标签和文本字段作为窗口小部件。 class LabelTextField extends JPanel { class LabelTextField扩展JPanel {

   private  JTextField     mjtf;
   private ActionListener  mal;


   public LabelTextField(String label, int textfieldWidth)
   {
      setLayout(new FlowLayout());

      JLabel lbl = new JLabel(label);
      add(lbl);

      mjtf = new JTextField(textfieldWidth);    
      add(mjtf);    
   }

   // The caller of this class will call this as he would for
   // JTextField.
   public void addActionListener(ActionListener al) 
   {
      mjtf.addActionListener(this);
      mal = al;     
   }

   // This will receive the return from JTextField and needs
   // to forward this on to calling class with caller object
   // not mjtf. 
   //
   // Problem: I can not figure out how to save caller object 
   // name so when this is called I can forward it on just like 
   // what JTextField would have done, ie caller can use 
   // ae.getSource() == m_nameFind.
   public void actionPerformed(ActionEvent ae) 
   {
      mal.actionPerformed(ae); // This does call the caller.
   }

} }

the value of ae.getSource() will be mjtf , because that is the component that generated the original ActionEvent . ae.getSource()的值将是mjtf ,因为这是生成原始ActionEvent的组件。 If you want to have the source of the event to be m_nameFind , ie your custom LabelTextField object, you need to set it manually: 如果要将事件源设置为m_nameFind ,即自定义LabelTextField对象,则需要手动设置它:

  public void actionPerformed(ActionEvent ae) 
  {
    ae.source=this; // this makes it look like the LabelTextField generated the event
    mal.actionPerformed(ae); 
  }

Is this what you want to do? 这是你想要做的吗?

-- -

edit 编辑

Thanks @Madprogrammer.. Perhaps you should recreate the ActionEvent like this 谢谢@Madprogrammer ..也许你应该像这样重新创建ActionEvent

  public void actionPerformed(ActionEvent ae) 
  {
      mal.actionPerformed(new ActionEvent(this, ae.getID(),
         ae.getCommand(), ae.getWhen(), ae.getModifiers() )); 
  }

Since you can't change the source of the ActionEvent, you need to create a new ActionEvent: 由于无法更改ActionEvent的源,因此需要创建一个新的ActionEvent:

public void actionPerformed(ActionEvent e)
{
    e = new ActionEvent(
        this,
        ActionEvent.ACTION_PERFORMED,
        e.getActionCommand(),
        e.getWhen(),
        e.getModifiers());

    mal.actionPerformed(e);
}

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

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