簡體   English   中英

Java Swing JFrame為游戲推出了另一個JFrame

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM