Java:无法从静态上下文引用

时间:2014-04-21 21:25:51

标签: java swing jframe

我试图制作一个框架,其中一个面板由两个位于框架底部的按钮组成。

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

我该如何解决?

5 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

JFrame Frame = new ControlledBall().new Viewer();

而不是:

JFrame Frame = new Viewer();

但是我不确定这是否是你想要的,因为ControlledBallJPanel ......

答案 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 你不能从静态方法访问非静态的东西