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

时间:2009-05-03 02:57:31

标签: 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?
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

这是一个可变范围问题。

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

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

(1)在ListenerClass中创建内部课程MyClass,然后将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("");
    }
  }
}

(2)在main方法中创建一个匿名内部类,这将允许myTextFieldmyTextFieldSubmit保持在同一个位置,只要它们被声明{{ 1}}。

final

(3)创建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(""); } }); } } 方法的本地类。同样,这将要求将文本字段和按钮声明为main以允许从内部类进行访问。

final

(4)提交对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()); } } 的引用,例如在构造函数中,并使ListenerClassmyTextField成为实例变量。

myTextFieldSubmit

(5)将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(""); } } myTextField设置为myTextFieldSubmit字段,并允许从static直接访问。

ListerClass

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在Java中出于任何目的使用侦听器是很常见的问题:如何让处理程序访问通知侦听器或其对等方的对象。

通常有两种惯例。

一种是直接从事件对象获取对象。你可以用getSource()做到这一点。但是那时你只会得到完成它的小部件。

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

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