【问题标题】:10 threads painting on one JPanel在一个 JPanel 上绘制 10 个线程
【发布时间】:2014-06-28 09:20:09
【问题描述】:

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

  1. 更改其属性,例如地图上的位置
  2. 检查地图上的其他线程
  3. 在面板上绘画自己

但是怎么做呢?

【问题讨论】:

  • 您在工作中使用了错误的工具。当您想要并发执行并不意味着并行(通常天真地假设)而是没有任何时间关系时,应该使用线程。另一方面,模拟通常意味着所有参与者/组件应在相互关联的情况下执行它们的活动,这是相反的。您应该使用普通对象和Timer

标签: java multithreading swing jpanel rendering


【解决方案1】:

不允许直接使用多线程更新 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 事件队列,它将在自己的线程中处理。

【讨论】:

  • 好、简单、好的答案,但你没有得到问题,或者我写得不够清楚。目标是用很少的线程对一个对象进行操作。我需要在哪里创建这个对象?在测试课?现在我已经在测试类中创建了它,但我觉得它不是好主意,我不知道为什么^^无论如何谢谢!
  • 这是正确的做法;一个完整的例子见here
  • 您可以点击左侧的empty check mark 接受答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多