2014-04-21 27 views
2

我試圖使一個框架與由兩個按鈕組成的面板組成,這兩個按鈕位於框架的底部。Java:不能從靜態上下文引用

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

你真的不應該用大寫字母來啓動變量名,它會讓讀者感到困惑,並且也會讓編譯器感到困惑。 –

+1

@HarryBlargle我很好,它是令人困惑的閱讀,但我希望有沒有Java編譯器那裏是與那個混淆^^ – xav

+0

@xav它可以認爲你在靜態環境中使用java.awt.Frame –

回答

-1

使內部類(瀏覽器)的靜態 public static class Viewer extends JFrame 你不能從靜態方法

存取權限非靜態的東西
0

你可以這樣做:

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

代替:

JFrame Frame = new Viewer(); 

但我不確定這是否真的是你想要的,因爲ControlledBallJPanel ...非靜態內部類的

0

實例容納一個指針到其封閉的對象,以便能夠引用其成員。例如參見Java inner class and static nested class一個副作用是它們不能從靜態方法創建,除了通過安裝ControlledBall類的中間對象之外,它們與封閉類的實際實例無關。

PS:這個隱含的this指針記住的另一個副作用(與您的用例不太相關)是它可能會導致資源泄漏,因爲它只要內部的實例保持外部實例處於活動狀態。

0

您在ControlledBall類中創建了一個公共內部類,這是您無法訪問它的原因,因爲您沒有ControlledBall類的實例。

儘管從縮進和代碼猜測,你可能打算做的是創建兩個獨立的類並從ControlledBall的主要方法實例化Viewer類。要做到這一點,將Viewer類移到它自己的文件Viewer.java,它應該工作。

0

「主」的方法是靜態的,在執行時,它的「含」類可能還沒有被實例化等類瀏覽器可能還不存在。由於這個例子顯然是程序的入口點,「查看器」當然不存在。

有很多方法來解決這個問題,比如創建ControlledBall的一個實例,然後使用該實例來創建「瀏覽器」。

這是我的個人風格通過實例「主」的集裝箱的一個實例,然後從那裏運行在Java程序中,以「走出靜態」儘快。我被告知,「主」是靜態的,所以它存在被父系統調用,並沒有太多的用處,我相信還有其他意見。這裏是一個簡短的例子,它缺少很多細節:

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(); 
} 

我使用'run'是因爲Thread。我知道很多飛鏢可以扔在這,它只是一個例子。

相關問題