代码之家  ›  专栏  ›  技术社区  ›  Josh Leitzel

如何使用侦听器访问其他元素?

  •  3
  • Josh Leitzel  · 技术社区  · 16 年前

    我正在设置一个图形用户界面,在这里我需要从表单元素中获取输入的信息并操作这些信息。这需要我使用一些元素来访问其他元素。

    例如,我有一个输入框( JTextField )还有一个按钮( JButton )旁边。当按下按钮时,我需要能够操作输入框中的文本。到目前为止我所做的一切都失败了。

    这就是我的代码现在的样子(我在注释中嵌入了我的问题):

    public class MyClass
    {
        public static void main(String args[])
        {
            // Form elements are in here
            JTextField myTextField = new JTextField(10);
            JButton myTextFieldSubmit = new JButton("Submit");
            myTextFieldSubmit.addActionListener(new ListenerClass());
        }
    }
    
    class ListenerClass implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // This is what happens when these elements are used
            // I need to be able to access the form elements from MyClass in here, but this doesn't seem possible with my current setup
            // For example, when the Submit button is pressed, I need to be able to myTextField.getText() and edit MyClass members
            // How should my setup be changed to accommodate these needs?
        }
    }
    

    谢谢你的帮助!

    3 回复  |  直到 16 年前
        1
  •  3
  •   coobird    16 年前

    这在很大程度上是一个可变范围的问题。

    当前,文本字段和按钮在 main 方法,因此为 ActionListener 这意味着它将无法访问这些变量。

    实现这一点有几种方法:

    (1)创建一个内部类 ListenerClass 在里面 MyClass 然后转动 myTextField myTextFieldSubmit 到的实例字段 类名 .

    public class MyClass
    {
      final static JTextField myTextField = new JTextField(10);
      final static JButton myTextFieldSubmit = new JButton("Submit");
    
      public static void main(String args[])
      {
        myTextFieldSubmit.addActionListener(new ListenerClass());
      }
    
      static class ListenerClass implements ActionListener
      {
        public void actionPerformed(ActionEvent e)
        {
          myTextField.setText("");
        }
      }
    }
    

    (2)在 主要的 方法,这将允许 MyTrimefield mytextfield提交 保持在同一个地方,只要他们被宣布 final .

    public class MyClass
    {
      public static void main(String args[])
      {
        final JTextField myTextField = new JTextField(10);
        final JButton myTextFieldSubmit = new JButton("Submit");
    
        myTextFieldSubmit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                myTextField.setText("");
            }
        });
      }
    }
    

    (3)使本地类成为 主要的 方法。同样,这需要声明文本字段和按钮 最终的 允许从内部类访问。

    public class MyClass
    {
      public static void main(String args[])
      {
        final JTextField myTextField = new JTextField(10);
        final JButton myTextFieldSubmit = new JButton("Submit");
    
        class ListenerClass implements ActionListener
        {
          public void actionPerformed(ActionEvent e)
          {
            myTextField.setText("");
          }
        }
    
        myTextFieldSubmit.addActionListener(new ListenerClass());
      }
    }
    

    (4)提交参考文件 ListEnter类 例如,在构造函数中,并且 MyTrimefield mytextfield提交 实例变量。

    public class MyClass
    {
      JTextField myTextField = new JTextField(10);
      JButton myTextFieldSubmit = new JButton("Submit");
    
      public MyClass()
      {
        myTextFieldSubmit.addActionListener(new ListenerClass(this));
      }
    
      public static void main(String args[])
      {
        new MyClass();
      }
    }
    
    class ListenerClass implements ActionListener
    {
      MyClass myClass;
    
      public ListenerClass(MyClass myClass)
      {
        this.myClass = myClass;
      }
    
      public void actionPerformed(ActionEvent e)
      {
        myClass.myTextField.setText("");
      }
    }
    

    (5)使 MyTrimefield mytextfield提交 进入之内 static 字段,并允许直接从 ListerClass .

    public class MyClass
    {
      static JTextField myTextField = new JTextField(10);
      static JButton myTextFieldSubmit = new JButton("Submit");
    
      public static void main(String args[])
      {
        myTextFieldSubmit.addActionListener(new ListenerClass());
      }
    }
    
    class ListenerClass implements ActionListener
    {
      public void actionPerformed(ActionEvent e)
      {
        MyClass.myTextField.setText("");
      }
    }
    

    可能还有更多的方法来实现这一点,并且可能有更好的方法来实现这一点。选择哪种方法实际上取决于所需的应用程序设计。

        2
  •  0
  •   JRL    16 年前

    您可以将引用传递给 MyClass 在构造函数中 ListenerClass .

        3
  •  0
  •   Uri    16 年前

    对于Java中的任何用途,侦听器的使用都是常见的:如何让处理程序访问通知侦听器或其同辈的对象。

    通常有两种约定。

    一种是直接从事件对象获取对象。可以使用getSource()执行此操作。但是你只会得到完成它的小部件。

    另一个选项是让Listener类能够访问小部件。一种方法是使用非静态的内部类(这取决于您如何声明它),在这种情况下,允许它访问包含类的成员。

    但是,在这种情况下,小部件是变量,而不是成员(您确定要这样做吗?)。因此,您唯一的解决方案是让成员在listner类中保存它们,然后不在add listener调用中创建侦听器,而是创建一个侦听器,传递相关的小部件,并添加侦听器。侦听器现在可以通过自己对存储在成员中的控件的引用来访问这些小部件。