我在一个实验室工作,要求我制作一个包含2个内部类的JFrame。一个进入JPanel的人,有一个文本区和一个jbutton。另一个实现动作监听器。如何将第二个类的anonymouse实例添加到已经在内部类中的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");
}
}
}
}
非常感谢任何帮助
答案 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
修饰符。鉴于作业的背景,我怀疑这是正确的。应该说“实例字段”。