我有2节课。当您单击特定位置时,第一个类将布尔值变为 true,如果第一个类中的布尔值为 true,则第二个类调用 frame.removeAll()
和 frame.add(new CanvasSelect())
。似乎只检查布尔值一次。
有什么办法可以让二等舱不断检查一等舱的布尔值吗?
我有2节课。当您单击特定位置时,第一个类将布尔值变为 true,如果第一个类中的布尔值为 true,则第二个类调用 frame.removeAll()
和 frame.add(new CanvasSelect())
。似乎只检查布尔值一次。
有什么办法可以让二等舱不断检查一等舱的布尔值吗?
正如评论中所建议的那样,如果您真的想知道发生了什么,您确实需要发布(精简版)代码。我可以想到这可能发生的三个可能原因。
可能性 1:您需要将布尔值标记为volatile
. 如果这里有多个线程在运行,那么如果该字段未标记为易失性字段,则其中一个线程可能会看到陈旧的值。但是,听起来您正在做 GUI 编程(可能使用 Swing),所以所有这些事件都应该发生在 GUI 事件线程中——因此我怀疑这是问题所在。不过,它仍然值得一试。
可能性 2:您正在根据布尔值设置事件处理程序,而不是检查事件处理程序中的布尔值。在这种情况下,该值只会被读取一次(当设置 ActionEventHandler 时),而不是在点击事件发生时。
可能性 3:当您清除框架时,您也在使用事件处理程序清除项目,并且您没有正确重置它们。我认为这是最有可能的问题。
以任何形式使用忙等待(如另一个答案中所建议的)是一个非常糟糕的主意,它是一种编程反模式(它应该只在非常特殊的情况下使用,比如低级 CPU 编程,当然永远不会在 Java 中使用) :
sleep
ing 会更好,但是您的代码会延迟对更改做出反应。而且你做的延迟越短,你浪费的 CPU 功率就越多。尽管如此,这是一种糟糕的编程模式。如果没有代码片段或更详细的解释,则不清楚您到底想要实现什么。一些一般性建议:
您可以使用下面给出的代码片段并将它们放入始终与您的主代码并行运行的线程中
while(true)
{
if(_val) //_val is your boolean variable
{
// your logic
}
Thread.sleep(100);
}
或者可以在单击该特定控件时引发事件,该控件检查值_val
并执行操作