在一个JPanel上画的10个线程

时间:2014-05-10 18:36:34

标签: java multithreading swing jpanel rendering

我在学习Java中的线程时遇到了一些问题。我们的目标是进行模拟,向我们展示兔子在某种类型的棋盘上如何从狼身上跑出来。每只狼和每只兔子都应该成为一个线索。所以我在Test类的main方法中创建了一个GUI,并创建了一个实现Runnable接口的新类。我认为这很容易和合乎逻辑。但是现在,我如何从这些线程中调用AddRabbit方法?因为非常线程应该像下面这样做:

  1. 像地图上的地方一样更改其属性
  2. 检查地图上的其他主题
  3. 在面板上绘画本身
  4. 但是怎么样?

2 个答案:

答案 0 :(得分:5)

不允许直接使用多个线程更新Swing组件 - Swing不是线程安全的。它处理的是一个Swing事件队列,因此如果必须更新现有线程中的JComponent,则将使用以下代码:

//You are currently in a separate thread that's calculating your rabbit positions
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        //Put in code to modify your Swing elements
    }
});

因此,每当您觉得需要更新GUI时,就可以使用SwingUtilities.invokeLater方法将Runnable实例传递到Swing事件队列,该方法将在自己的线程中处理。

答案 1 :(得分:4)

建议continuationhere是从多个线程更新GUI的不错选择,但可能很难正确地同步对共享数据的访问。

或者,使用javax.swing.Timer定期更新管理狼和兔属性的模型。检查在网格上移动的对象的相关示例here。为了获得更大的灵活性,请使用图示为Model–View–Controllerhere模式。