我已经制作了简单的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();
}
请帮忙。
答案 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);
}