2012-07-29 74 views
-1

我正在嘗試爲遊戲創建標題屏幕。到目前爲止,一切都很順利,只是這個JFrame拒絕關閉。我在不同的JFrame中使用不同的JPanel中的JButton。我得到的錯誤Static setVisible JFrame

「不能使靜態參考從式窗口的非靜態方法 調用setVisible(布爾)」

package ZombieFunTimeGo; 

import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JProgressBar; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SuperZombieFunTimeGo extends JFrame{ 

    private TitleScreen ts; 
    boolean visible; 

    public SuperZombieFunTimeGo() { 
     add(new TitleScreen()); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(1280, 720); 
     ts = new TitleScreen(); 
     Container pane = getContentPane(); 
     pane.add(ts); 
     setContentPane(ts); 
     setLocationRelativeTo(null); 
     setTitle("Super Zombie Fun Time Go!"); 
     setResizable(false); 
     setVisible(true); 
    } 

    public void pullThePlug() { 
     WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); 
     Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev); 
    } 

    public static void main(String[] args) { 
     new SuperZombieFunTimeGo(); 
    } 
} 
+3

*「我想創建一個遊戲的標題屏幕。」*使用['SplashScreen'](http://docs.oracle.com/javase/7/docs/ api/java/awt/SplashScreen.html)。 – 2012-07-29 02:33:12

+0

pullThePlug有什麼意義?只需setVisibe(false)。您需要確保您將標題框的有效參考傳遞給負責關閉它的類 – MadProgrammer 2012-07-29 04:34:32

回答

1

你說的錯誤是編譯錯誤,而不是運行時錯誤。你甚至無法編譯該文件。看來你正在執行你的代碼的以前的編譯版本。你可以發佈這個錯誤正在拋出的行嗎?如果是這樣,我可以改進我的答案。當您嘗試訪問靜態上下文中的某個非靜態成員時會發生此錯誤,因爲您無法更改靜態成員內的對象狀態,因爲靜態成員屬於類而不屬於對象。您在代碼中做了一些奇怪的事情......您向JFrame添加了TitleScreen,但在此之後,您再次執行了此操作(通過內容窗格)並將TitleScreen設置爲框架的內容窗格。看起來你是Swing的新手。我對嗎?

+0

是的。這基本上是我試圖寫的第一件事。 – MCPlummet 2012-07-29 14:42:52

+0

startButton.addActionListener(新的ActionListener(){ \t \t \t公共無效的actionPerformed(ActionEvent的E) \t { \t新theActualGame(); \t SuperZombieFunTimeGo.setVisible(假); \t} \t \t}); – MCPlummet 2012-07-29 14:46:25

+0

我得到setVisible上的錯誤(false) – MCPlummet 2012-07-29 14:46:46

1

對,你在你的問題中發佈的代碼是完全不相關的。您在留言發佈的代碼是一個導致了問題

startButton.addActionListener(新的ActionListener(){ 公共無效的actionPerformed(ActionEvent的五){ 新theActualGame(); SuperZombieFunTimeGo.setVisible(假);} });

問題是你打電話給setVisible的方法,因爲它是static method而不是這種情況。您只應在SuperZombieFunTimeGo實例上調用該方法。在這種情況下,您的ActionListener需要對該實例的引用,並在該實例上調用setVisible。所以像

SuperZombieFunTimeGo titleScreen = ...; 
... 
startButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    new theActualGame(); 
    titleScreen.setVisible(false); } 
});