У меня есть один такой класс
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();
}
Я вызываю эту функцию initBlockSpawner () из Конструктора JFrame. 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 в кубах Insttitiated из потоков, они дают мне это [, 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, почему это? Я изменяю метод run () BlockSpawner на что-то вроде этого:
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? или сейчас что-то другое?