[英]Java Swing JFrame launch another JFrame for game
我正在使用Java開發一個小游戲。 我的應用程序有一個主JFrame,可以通過單擊JButton來創建另一個Window(游戲窗口)。 我已經獨自測試過我的游戲窗口,一切正常。
這是我的游戲窗口構造函數:
public GameWindow(final GameController controller)
{
super("Boulder Dash Game");
this.controller = controller;
this.controller.registerObserver(getCurrentFrame());
this.gamePanel = new GamePanel(controller);
this.frameWidth = controller.getColumns() * 16;
this.frameHeight = controller.getRows() * 16 + 76;
getContentPane().add(gamePanel, BorderLayout.CENTER);
setSize(frameWidth, frameHeight);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
controller.startGame();
}
controller.startGame()方法啟動游戲循環。 當我直接從主窗口啟動此窗口時,游戲循環工作正常。
現在,我想從我的主框架啟動這個GameWindow框架。 這是我主要框架中的代碼:
playButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final @Nullable ActionEvent e)
{
String selectedItem = (String) levelsComboBox.getSelectedItem();
assert selectedItem != null;
controller.lauchGame(selectedItem);
}
});
controller.launchGame(String selectedItem)是一種用於加載游戲關卡並啟動游戲窗口的方法。 這是代碼
public void lauchGame(final String levelQueried)
{
assert levelQueried != null;
Level level = LevelRepository.load(levelQueried);
assert level != null;
GameController controller = new GameController(model);
GameWindow view = new GameWindow(controller);
}
我的問題是,當我從另一個JFrame啟動GameWindow時,上面沒有任何元素。 如果我沒有在構造函數中啟動游戲循環,則我的游戲窗口似乎已正確初始化(內容,退出關閉動作...)。 但是,當我啟動游戲循環時,我只是擁有一個沒有內容的空JFrame(大小正確)。而且當我嘗試退出框架時,我無法...
這是我的游戲循環代碼:
public void start() throws InterruptedException // Game loop method
{
boolean updateGame = true;
while ( !isFinish() ) {
// We update the elements only 1 round of 2
if ( updateGame ) {
updateExitState();
getPlayField().updateMoovableEntities();
updateGame = false;
} else {
updateGame = true;
}
Thread.sleep(100);
// Animate the sprite at every round
setChanged();
notifyObservers(); // inform that a repaint is necessary
}
LOGGER.debug("The game loop for the current level is now finished.");
}
在控制台上,我可以看到正在播放gameloop並且正確調用了update方法。但是從來沒有調用paintComponent,因此框架上沒有任何東西!
我對這個問題一無所知...有人可以幫我嗎?
編輯:
謝謝您的回答。 我已經使用修改了GameWindow的構造函數
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
controller.startGame();
}
});
好一點了,現在我的框架已經正確初始化了。 但是現在還有另一個問題,監聽器不再可用...我無法與框架進行任何交互(無法退出,或執行任何其他操作...)。 怎么了 ?
通過在其上運行while (true)
循環,可以完全凍結Swing事件線程(EDT或事件分發線程)。 不要那樣做 而是在后台線程中運行while循環,或者使用Swing計時器來驅動游戲循環。 有關更多信息,請閱讀Swing中的並發 。 另外,請閱讀本網站上的“使用多個JFrames”問題。
請注意,當您(錯誤地)在主方法中啟動GUI和游戲循環時,您的游戲循環在主線程中運行,而不是在Swing事件線程中運行,因此在這種情況下您的游戲可以運行,但這不是一個好的解決方案,因為主GUI也從Swing事件線程啟動,這可能導致間歇性的難以調試的線程錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.