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

Jos*_*zel 3 java user-interface listeners

我正在设置一个 GUI,我需要在其中获取从表单元素输入的信息并处理信息。这需要我使用一些元素来访问其他元素。

例如,我有一个输入框 ( 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?
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

coo*_*ird 5

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

目前,文本字段和按钮在main方法的范围内,因此为 设置单独的类ActionListener将意味着它无法访问这些变量。

有几种方法可以实现这一点:

(1)制作的内部类ListenerClassMyClass,并打开myTextFieldmyTextFieldSubmit进入的实例字段MyClass

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("");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

(2) 在main方法中创建一个匿名内部类,这将允许myTextFieldmyTextFieldSubmit保持在同一位置,只要它们被声明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("");
        }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

(3) 制作一个局部于main方法的局部类。同样,这将需要声明文本字段和按钮final以允许从内部类访问。

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

(4) 处理对 的引用ListenerClass,例如在构造函数中,以及制作myTextFieldmyTextFieldSubmit实例变量。

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("");
  }
}
Run Code Online (Sandbox Code Playgroud)

(5) 制作myTextFieldmyTextFieldSubmit进入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("");
  }
}
Run Code Online (Sandbox Code Playgroud)

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