gpt4 book ai didi

java - 如何使用监听器访问其他元素?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:52 24 4
gpt4 key购买 nike

我正在设置一个 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?
}
}

感谢您的帮助!

最佳答案

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

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

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

(1) 在MyClass中创建一个内部类ListenerClass,并将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 保留在同一个地方,只要它们被声明为 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) 创建一个局部于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());
}
}

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

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

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

关于java - 如何使用监听器访问其他元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com