如何从类中添加匿名实例作为ActionListener

时间:2016-04-18 19:50:33

标签: java class oop

我在一个实验室工作,要求我制作一个包含2个内部类的JFrame。一个进入JPanel的人,有一个文本区和一个jbutton。另一个实现动作监听器。如何将第二个类的anonymouse实例添加到已经在内部类中的JButton。以下是获得更好理解的简要说明。

enter image description here

这是我到目前为止编写的代码。我可以让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");

        }
    }
}
}

非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

您可以将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");
    }
}

没有必要检查源btw。 AL只收听1个来源。

RegisterPanel p = new RegisterPanel();
p.button.addActionListener(new SubmitResponder(p));

答案 1 :(得分:1)

p.button.addActionListener(new SubmitResponder());

这里SubmitResponder已经是一个匿名的实例了,因为它没有名字。

你的错误"没有封闭的实例"是无关的。由于SubmitResponder不是RegisterPanel的内部类(它是兄弟姐妹),因此它不属于RegisterPanel的实例,因此它无法在逻辑上引用{{ 1}}。怎么知道是哪个实例?可能有很多甚至为零,具体取决于父RegisterPanel.this决定创建的数量。碰巧只有一个,但这不是重点。另一方面,如果你说FormFrame毫无疑问,无论代码是什么意味着什么,除非FormFrame.this停止成为内部类或者它变为静态。这有意义吗?

要做你想做的事,RegisterPanel需要通过SubmitResponder中的方法与RegisterPanel对话。顺便说一下,除非FormFrame还有一个名为FormFrame.this.doSomething()的方法,否则您实际上不需要说SubmitResponder

答案 2 :(得分:0)

说明告诉您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(...);
            }
        }
    }
}

现在,您可以从panel课程中访问SubmitResponder

作为旁注,说明书使用了一些含糊不清的术语:

  • “匿名实例”不是具有确切含义的官方术语。
  • 使用官方定义,“类字段”意味着static修饰符。鉴于作业的背景,我怀疑这是正确的。应该说“实例字段”。