我有一堂像这样的课
public class BlockSpawner implements Runnable{
public static long timeToSpawn;
private GtrisJFrame frame;
public BlockSpawner(GtrisJFrame frame)
{
this.frame = frame;
timeToSpawn = 2000;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(timeToSpawn);
}
catch(InterruptedException e)
{
//Unhandled exception
}
//After awake, instanciate 2 blocks
//get the position of the first one
int index = Block.getRandomStartPosition();
new Block(frame, index);
new Block(frame, index+1);
}
}
}
我在 JFrame 主类中实例化这个类,并像这样启动它的线程:
private void initBlockSpawner()
{
spawner = new BlockSpawner(this);
new Thread(spawner).start();
}
我在 JFrame 构造函数中调用了这个 initBlockSpawner() 函数。Block Class 确实有点大,但是简单来说,它实现了runnable,在其构造函数的末尾调用了它的run() 方法。run() 方法只会使块以一定的速度下落。我曾尝试在 JFrame 构造函数中手动实例化新块,它们可以工作,它们会重新绘制并掉落。但是每当我想从其他线程实例化块时,它们似乎会下降(即它的属性会更新每个循环),但它们不会在 JFrame 中绘制。
作为附加信息,我使用的是 NetBeans,并且由于应用程序入口点位于 JFrame 类上,因此 main 方法如下所示:
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GtrisJFrame().setVisible(true);
}
});
}
我在 Java 线程、awt 事件和 swing 组件方面没有太多经验。但是我在这里读到的东西让我觉得我的问题是只有一个线程可以控制摆动组件,或者什么......有什么办法可以解决我的问题吗?
提前致谢。
编辑:附加信息,每当我从线程检查实例化多维数据集上的 toString 方法时,它们都会给我这个 [,0,0,0x0],但是当我在同一个 JFrame 类中实例化它们时,它们会给我这个结果 [,0, 0,328x552],它们出现在框架上。这个 328x552 值与 getPreferredSize() 返回的组件维度相同...我试图通过像这样实例化它们来强制它们达到该维度:
new Block(this, index).setPreferredSize(new Dimension(328, 552));
但它没有用,任何人都知道这个 [,0,0,328x552] 值可能意味着什么?
谢谢大家,我想我们快到了!
编辑 2:我意识到组件的大小是 x:0 y:0,这是为什么呢?我将 BlockSpawner 的 run() 方法更改为如下内容:
public void run()
{
while(true)
{
System.out.println("SPAWN");
int index = Block.getRandomStartPosition();
new Thread(new Block(frame, index)).start();
new Thread(new Block(frame, index+1)).start();
try
{
Thread.sleep(timeToSpawn);
}
catch(InterruptedException e)
{
//Unhandled exception
}
}
}
第一次运行,一切正常!甚至这对块在 JFrame 上绘制并正确落下,但是在 Thread.sleep() 之后,其余的只是被实例化,但是它们的 getSize() 方法给了我 x:0 y:0; 这仍然与 One Dispatcher Thread 问题有关吗?还是现在不同了?