我试图制作一个框架,其中一个面板由两个位于框架底部的按钮组成。
public class ControlledBall extends JPanel {
public static void main(String[] args) {
JFrame Frame = new Viewer();
Frame.setSize(1000, 500);
Frame.setTitle("Bouncing Ball");
Frame.setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE));
Frame.setVisible(true);
}
public class Viewer extends JFrame {
JButton buttonGo = new JButton("GO");
JButton buttonStop = new JButton("STOP");
JPanel aPanel = new JPanel();
public Viewer() {
aPanel.add(buttonGo);
aPanel.add(buttonStop);
this.add(aPanel, BorderLayout.SOUTH);
}
}
}
问题在于:
JFrame Frame = new Viewer();
告诉我
无法从静态上下文引用ControlledBall.this
我该如何解决?
答案 0 :(得分:0)
您可以执行以下操作:
JFrame Frame = new ControlledBall().new Viewer();
而不是:
JFrame Frame = new Viewer();
但是我不确定这是否是你想要的,因为ControlledBall
是JPanel
......
答案 1 :(得分:0)
非静态内部类的实例持有指向其封闭对象的指针,以便能够引用其成员。参见例如Java inner class and static nested class一个副作用是它们不能从静态方法实例化,静态方法与封闭类的实际实例无关,除非通过实例化ControlledBall
类的中间对象。 p>
PS:这个隐式this
指针要记住的另一个副作用(与你的用例不太相关)是它可能导致资源泄漏,因为它使外部实例保持活着,只要内部实例住。
答案 2 :(得分:0)
您已在ControlledBall
类中创建了一个公共内部类,这就是您无法访问它的原因,因为您没有ControlledBall
类的实例。
从缩进和代码中猜测,您可能要做的是创建两个单独的类,并从Viewer
的主方法实例化ControlledBall
类。为此,请将Viewer
类移动到名为Viewer.java
的文件中,它应该可以正常工作。
答案 3 :(得分:0)
“main”方法是静态的,并且在执行时,它的“包含”类可能尚未实例化,因此类查看器可能尚不存在。由于此示例显然是程序的入口点,因此“查看器”肯定尚不存在。
有很多方法可以解决此问题,例如创建ControlledBall实例,然后使用该实例创建“Viewer”。
通过实例化“main”容器的实例然后从那里运行,在Java程序中“脱离静态”ASAP是我的个人风格。我被教导说“主”是静态的,所以它存在被父系统调用而不是更多的用途,我相信还有其他意见。这是一个简短的例子,缺少许多细节:
public static void main(String[] args) {
// Pass 'args' to which ever method you prefer
ControlledBall app = new ControlledBall(args);
app.run(args);
}
private void run(String[] args) {
JFrame Frame = new Viewer();
}
我因为Thread而使用'run'。我知道很多飞镖都可以投掷,这只是一个例子。
答案 4 :(得分:-1)
使内部类(Viewer)保持静态
public static class Viewer extends JFrame
你不能从静态方法访问非静态的东西