作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 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/
我是一名优秀的程序员,十分优秀!