Java简单JFrame为null

时间:2016-01-20 19:37:44

标签: java eclipse jframe

我已经制作了简单的JFrame工作正常,除非我试图从其他类访问它时返回null。所以我为它做了getter(public static JFrame getWindow())它返回null。如果我将JFrame设置为public并尝试以这种方式访问​​它,则返回null。当我创建它时,它在游戏引擎启动后立即变为空。

主:

public class Main {

private static String title = "2D SquareWorld 0.";
private static String version = "";

private static JFrame window;
private static Container container;

public static void main(String[] args) {

    GameEngine game = new GameEngine();

    window = new JFrame();

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setTitle(title + Version.newVersion());
    window.setResizable(false);
    window.add(game);
    window.setSize(1000, 720);
    window.setLocationRelativeTo(null);
    window.setVisible(true);

    game.start();

}

public static Container getContainer() {

    return container;

}

public static JFrame getWindow() {

    return window;

}

}

GameEngine:

package GameEngine;

public class GameEngine extends Canvas implements Runnable, KeyListener,                                                       MouseListener, MouseMotionListener {

private static final long serialVersionUID = 1L;

private Thread thread;
private boolean running;

private GameStateManager gsm;

public GameEngine() {

    gsm = new GameStateManager();

}

public void start() {

    thread = new Thread(this, "Game");
    thread.start();

    running = true;

    init();

}

public void init() {

    Data.setValue("ScreenWidth", getWidth());
    Data.setValue("ScreenHeight", getHeight());

    addKeyListener(this);

}

public void update(double delta) {

}

public void render() {

    BufferStrategy bs = getBufferStrategy();

    if(bs == null) {

        createBufferStrategy(2);

        return;

    }

    Graphics g = bs.getDrawGraphics();
    Graphics2D g2 = (Graphics2D) g;

    g2.setColor(Color.white);
    g2.fillRect(0, 0, getWidth(), getHeight());

    gsm.draw(g2);

    g2.dispose();
    bs.show();

}

public void run() {

    long lastLoopTime = System.nanoTime();
    long lastFpsTime = 0;

    final int TARGET_FPS = Fps.TargetFPS;
    final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;   

    int CurrentFps = 0;

    while(running) {

        long now = System.nanoTime();
        long updateLength = now - lastLoopTime;

        lastLoopTime = now;

        double delta = updateLength / ((double) OPTIMAL_TIME);

        lastFpsTime += updateLength;

        CurrentFps++;

        if (lastFpsTime >= 1000000000) {

            Fps.FPS = CurrentFps;

            lastFpsTime = 0;
            CurrentFps = 0;

        }

        update(delta);

        render();

        try {

            if(((lastLoopTime-System.nanoTime() + OPTIMAL_TIME) / 1000000) >= 1) {

                Thread.sleep((lastLoopTime-System.nanoTime() + OPTIMAL_TIME) / 1000000);

            }

        }catch(InterruptedException IE) {

        }

    }

}

public void mouseDragged(MouseEvent me) {

}

public void mouseMoved(MouseEvent me) {

}

public void mouseClicked(MouseEvent me) {

}

public void mouseEntered(MouseEvent me) {

}

public void mouseExited(MouseEvent me) {

}

public void mousePressed(MouseEvent me) {

}

public void mouseReleased(MouseEvent me) {

}

public void keyPressed(KeyEvent ke) {

    gsm.keyPressed(ke.getKeyCode());

}

public void keyReleased(KeyEvent ke) {

}

public void keyTyped(KeyEvent ke) {

}

}

我从这个班级调用了getWindow:

public class LoginState extends GameState {

private GameStateManager gsm;

public LoginState(GameStateManager gsm) {

    this.gsm = gsm;

}

private JTextField username;
private JTextField password;

public void init() {

    username = new JTextField(25);

    username.setVisible(true);
    username.setBounds(20, 20, 50, 50);

    Main.getWindow().add(username);

}

public void draw(Graphics2D g) {

    g.setColor(Color.gray);
    //g.fillRect(0, 0, Data.getIntegerValue("ScreenWidth"), Data.getIntegerValue("ScreenHeight"));

}

GameStateManager:

public class GameStateManager {

private ArrayList<GameState> gameStates;

public static final int LOGINSTATE = 0;
public static final int MENUSTATE = 1;
public static final int PLAYSTATE = 2;

private static int currentState;

public GameStateManager() {

    gameStates = new ArrayList<GameState>();

    currentState = LOGINSTATE;

    gameStates.add(new LoginState(this));
    gameStates.add(new MenuState(this));
    gameStates.add(new PlayState(this));

    gameStates.get(currentState).init();

}

请帮忙。

2 个答案:

答案 0 :(得分:1)

感谢您的更新,但是......您仍然没有显示LoginWindow的初始化位置。

猜测 - 你的程序是从你正在显示的方法开始的另一个主方法,因此永远不会调用创建和分配你的JFrame到静态窗口字段的主要方法。我建议您以这种方式避免使用静态方法和字段,这取决于初始化的main方法。 Java是一种OOP语言 - 因此,使代码符合OOP并在保证调用的代码中创建所需的对象,然后将它们分配给非静态字段。

编辑: 只需交换两行:

GameEngine game = new GameEngine();
window = new JFrame();

window = new JFrame();
GameEngine game = new GameEngine();

答案 1 :(得分:0)

您的JFrame在main Main方法中初始化。最好使用静态初始化块。

static {
    window = new JFrame();

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setTitle(title + Version.newVersion());
    window.setResizable(false);
    window.add(game);
    window.setSize(1000, 720);
    window.setLocationRelativeTo(null);
    window.setVisible(true);
}