gpt4 book ai didi

java - 没有紧密耦合对象的多线程

转载 作者:行者123 更新时间:2023-12-01 18:06:42 26 4
gpt4 key购买 nike

我正在尝试用 Java 构建一个简单的游戏。遇到了 JTextPanel 直到游戏循环终止后才更新的问题,这对于玩家来说当然不是一个好的体验。

我不熟悉多线程,但正在尝试弄清楚它。我现在可以在多个线程中运行单独的代码,但我无法理解如何让线程交互。我很可能错过了一些简单的东西,但我无法通过搜索找到它,所以我把自己交给了你。我命悬一线……

Controller 类和主线程。我需要 gamePanel 和游戏单独运行。我尝试在单独的线程中运行 Game 类,但游戏代码未在 gamePanel 中运行。

Controller :

import javax.swing.JFrame;
import javax.swing.SwingUtilities;



public class Controller_LetterFall{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new MainFrame();
}
});

}
}

还有 MainFrame 类。我尝试在新线程中运行gameplay()。

package wordFall;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MainFrame extends JFrame implements Runnable {

private GamePlay game;
private TextPanel gamePanel;
private Header header;
private Player player;
private Dictionary dictionary;
private GamePlay game;

public MainFrame(){
super("Game");
// Set the size of the frame.
setSize(400,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);


// Establish default player.
player = new Player();
dictionary = new Dictionary();
game = new GamePlay();
header = new Header();
gamePanel = new TextPanel();
add(header, BorderLayout.NORTH);
add(gamePanel, BorderLayout.CENTER);

this.game.setBoardInterface(
new BoardInterface(){
@Override
public void redraw(String text) {
gamePanel.appendText(text);
}
});
}
@Override
public void run() {
game.play();
System.out.println("The game is over.");
}
}

如有任何帮助,我们将不胜感激。

最佳答案

您需要诸如线程安全数据容器之类的东西。我们将其命名为GameData。您的 GamePlay 对象需要知道 GameData 对象,并且 UI 也需要知道这一点,因为用户所做的更改必须传播到 GameData 对象。

在您的 GamePlay 对象中,您可以每秒左右查找 GameData 对象的变化。如果有变化,那么你有事可做,如果没有……

但最好使用类似事件的方法,即 Observer Pattern 。如果 UI 进行更改,GamePlay 将通过可观察的 GameData 对象收到通知。此外,当数据发生变化时,UI 也可以收到通知。

这非常清楚地分离了关注点并遵循 Model View Controller 模式。

关于java - 没有紧密耦合对象的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35841196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com