![](/img/trans.png)
[英]How do I add an ActionListener to an instance of my class that extends JButton?
[英]How to add an anonymous instance off a class as an ActionListener
我在一个需要我制作带有2个内部类的JFrame的实验室中工作。 带有JPanel的控件有一个文本区域和一个jbutton。 另一个实现动作侦听器。 如何将第二个类的匿名实例添加到已经在内部类中的JButton中。 这里是简要了解的内容。
这是我到目前为止编写的代码。 我可以使Frame出现,但是JPanel不会出现,JButtons或JTextArea也不会出现。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
@SuppressWarnings("serial")
public class FormFrame extends JFrame
{
public static void main(String[] args)
{
JFrame frame = new FormFrame();
frame.setLocationRelativeTo(null);
}
public FormFrame()
{
Container contentPane = getContentPane();
RegisterPanel p = new RegisterPanel();
p.button.addActionListener(new SubmitResponder());
//
// Here is where im lost...
//
contentPane.add(p);
setSize(300, 200);
setVisible(true);
}
class RegisterPanel extends JPanel
{
JPanel panel = new JPanel();
JTextField text = new JTextField();
JButton button = new JButton("Submit");
}
class SubmitResponder implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource()== RegisterPanel.button) //Asks me to make button static here
{
//Shows "No enclosing instance of the type FormFrame.RegisterPanel is accessible in scope"
RegisterPanel.this.text.setText("Submit Complete");
}
}
}
}
任何帮助,将不胜感激
您可以将RegisterPanel
实例传递给操作侦听器:
class SubmitResponder implements ActionListener {
private final RegisterPanel rp;
public SubmitResponder(RegisterPanel rp) {
this.rp = rp;
}
@Override
public void actionPerformed(ActionEvent e) {
rp.text.setText("Submit Complete");
}
}
无需检查源代码。 AL仅收听1个源。
RegisterPanel p = new RegisterPanel();
p.button.addActionListener(new SubmitResponder(p));
p.button.addActionListener(new SubmitResponder());
实际上, SubmitResponder
已经是一个匿名实例,因为它没有名称。
您与“无封闭实例”有关的错误无关。 由于SubmitResponder
不是RegisterPanel
的内部类(它是同级兄弟),它不属于RegisterPanel
的实例,因此不能在逻辑上引用RegisterPanel.this
。 它怎么知道是哪个实例? 取决于父FormFrame
决定创建多少个,可能有很多甚至是零。 碰巧只有一个,但这不是重点。 另一方面,如果您说的是FormFrame.this
,那么无论代码做什么,毫无疑问这意味着什么,除非RegisterPanel
不再是内部类或它成为静态类。 那有意义吗?
若要执行您想要的操作, SubmitResponder
需要通过FormFrame
的方法与RegisterPanel
进行FormFrame
。 顺便说FormFrame.this.doSomething()
除非SubmitResponder
也有一个名为doSomething
的方法,否则您实际上不需要说FormFrame.this.doSomething()
。
这些说明告诉您RegisterPanel
应该是FormFrame
类中的一个字段,您尚未完成。 像这样:
public class FormFrame extends JFrame
{
RegisterPanel panel;
...
public FormFrame()
{
panel = new RegisterPanel();
...
}
...
class SubmitResponder implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == panel.button)
{
panel.text.setText(...);
}
}
}
}
现在,您可以从SubmitResponder
类内部访问panel
。
附带说明一下,这些指令以一种模棱两可和错误的方式使用了一些术语:
static
修饰符。 考虑到任务的背景,我怀疑这是正确的。 它可能应该说“实例字段”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.