私はこのような単一のクラスを持っています
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 クラスにあるため、メイン メソッドは次のようになります。
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GtrisJFrame().setVisible(true);
}
});
}
Java スレッド、awt イベント、swing コンポーネントの経験はあまりありません。しかし、私がここで読んだことは、私の問題は、swing コンポーネントを制御できるスレッドが 1 つしかないこと、または何かだと思います...私の問題を解決する方法はありますか?
前もって感謝します。
編集:追加情報、スレッドからインスタンス化されたキューブで 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 の問題に何らかの形で関連していますか? それとも今は違うのですか?