gpt4 book ai didi

multithreading - 尝试更改内容时 Scala 摆动面板消失(仅在运行线程时)

转载 作者:行者123 更新时间:2023-12-04 04:26:44 24 4
gpt4 key购买 nike

所以我正在编写一个 boid 模拟程序作为学校的一个项目。我的程序支持这些不与其他组聚集的多个不同组,它们都有不同的设置,我通过在创建新部落时将 BoxPanel 添加到程序的主 GUI 来完成这些设置,并且这些 BoxPanel 有一个设置按钮,使用组设置打开一个新框架。

当我启动程序并添加代码中的所有预定义部落时,这非常有效。现在我创建了 GUI 的一个新部分,让您可以创建这些 boid 的新组并在模拟运行时添加它们,这就是我遇到问题的时候。

出于某种奇怪的原因,它添加了组就好了,在模拟中使用了正确的设置,但它不会将 BoxPanel 添加到主 GUI。它使我在模拟一侧的整个设置栏完全消失。我对此进行了测试,如果我在计算线程的开头添加部落,它会做同样的事情,所以这似乎是多线程和摆动的问题。任何想法是什么导致了这个或如何解决这个问题?我对此完全困惑。

tl;博士: 当我还没有启动线程时,下面用于添加部落的代码工作正常,但是如果我在启动线程后尝试使用它,则 optionPanel 显示为空。

这是将 BoxPanel 添加到主 gui 的代码:

      def addTribe(tribe: Tribe) = {
tribeFrames += new TribeSettingFrame(tribe)
tribeBoxPanels += new TribeBoxPanel(tribe)
this.refcontents
}

private def refcontents = {
top.optionPanel.contents.clear()
top.optionPanel.contents += new BoxPanel(Orientation.Vertical) {
tribeBoxPanels.foreach(contents += _.tribeBoxPanel)
}
top.optionPanel.contents += new BoxPanel(Orientation.Horizontal) {
contents += top.addTribeButton
}
top.optionPanel.contents += new BoxPanel(Orientation.Horizontal) {
contents += top.vectorDebugButton
}
}


new Thread(BoidSimulation).start()

哦,我测试了它是否真的通过打印出内容的大小来添加它应该添加的内容,并且一切都很好,只是不会绘制它们。

编辑:经过一番挖掘后,它似乎真的是从线程更新摆动的事情。很多地方都建议使用 SwingWorker,但从我收集的有关它的信息来看,我认为它不适合我的程序,因为它是一个连续的模拟,而且我必须每帧都不断地制作新的 SwingWorker。

EDIT2:尝试从线程调用该方法,如下所示:
SwingUtilities.invokeLater(new Runnable() {
override def run() {
GUI2D.addTribe(tribe)
}
});

没有任何区别。 我开始认为这是我如何使用 TribeBoxPanel 和 TribeSettingFrame 的问题。这些对象都只包含一种返回所需 BoxPanel 或 Frame 的方法。这个实现不好吗?如果是这样,创建动态 BoxPanel 和框架的更好方法是什么?

最佳答案

Swing 不是线程安全的。

跟着我重复一遍。

Swing 不是线程安全的。

听到合唱了吗? Swing is not thread safeofficial documentation .

还有一个非常简单的解决方法。

SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
// your stuff
}
});

在 Scala 中,这被支持为:
Swing.invokeLater(/* your stuff */)

关于multithreading - 尝试更改内容时 Scala 摆动面板消失(仅在运行线程时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28852081/

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