Java - 休眠线程模拟变化图像
Java - Sleeping thread to simulate changing image
所以我做了很多搜索,但我无法找到解决我遇到的问题的方法。使用 Java 的 JFrame 设计 GUI 似乎相当简单,但当它不仅仅是一个 setText 调用时以视觉方式更新它们似乎要棘手得多,尤其是当您想要在两者之间模拟一些等待时间以进行视觉识别时。我不熟悉多线程和我找到的所有解决方案,我似乎无法按照我需要的方式开始工作。
我想要做的是在一个简单的骰子游戏的特定面着陆之前模拟骰子滚动。为此,我只是每隔几分之一秒(在本例中为 150 毫秒)在骰子图像的不同面之间切换一定次数(例如 10 次)。
有趣的是,这段代码在其当前状态下完全按照我希望的方式运行(在接受任何用户输入之前执行完整的 10 次滚动循环,但 GUI 的每个组件都是可见并按预期工作)。问题是,当重新滚动时,GUI 变为空白,直到所有线程休眠完成。
由于我对这种事情的了解不足,所以我不明白为什么它第一次会按我想要的方式工作,但之后的任何时候都不会。希望我能得到一些关于正确方法的帮助来完成这个或修复我目前正在做的事情。谢谢!
private void rollDice()
{
for(int i = 0; i < 10; i++)
{
dice1 = (int) (Math.random() * 6) + 1;
dice2 = (int) (Math.random() * 6) + 1;
img1 = new ImageIcon(dice1 + ".png");
img2 = new ImageIcon(dice2 + ".png");
try
{
Thread.sleep(150);
}
catch(Exception e)
{
}
lbl1.setIcon(img1);
lbl2.setIcon(img2);
}
}
试试这个我发现 here。
new Thread(new Runnable
{
public void run()
{
for(int count = 0; count < PREROLLS; count++)
{
//Add your for loop logic here!
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
//then update you icon here. I would start with one die if I were you.
imgDice1 = new ImageIcon(path + dice1 + ".png");
}
});
try { Thread.sleep(100); } catch(Exception e) {}
}
}
}).start();
所以我做了很多搜索,但我无法找到解决我遇到的问题的方法。使用 Java 的 JFrame 设计 GUI 似乎相当简单,但当它不仅仅是一个 setText 调用时以视觉方式更新它们似乎要棘手得多,尤其是当您想要在两者之间模拟一些等待时间以进行视觉识别时。我不熟悉多线程和我找到的所有解决方案,我似乎无法按照我需要的方式开始工作。
我想要做的是在一个简单的骰子游戏的特定面着陆之前模拟骰子滚动。为此,我只是每隔几分之一秒(在本例中为 150 毫秒)在骰子图像的不同面之间切换一定次数(例如 10 次)。
有趣的是,这段代码在其当前状态下完全按照我希望的方式运行(在接受任何用户输入之前执行完整的 10 次滚动循环,但 GUI 的每个组件都是可见并按预期工作)。问题是,当重新滚动时,GUI 变为空白,直到所有线程休眠完成。
由于我对这种事情的了解不足,所以我不明白为什么它第一次会按我想要的方式工作,但之后的任何时候都不会。希望我能得到一些关于正确方法的帮助来完成这个或修复我目前正在做的事情。谢谢!
private void rollDice()
{
for(int i = 0; i < 10; i++)
{
dice1 = (int) (Math.random() * 6) + 1;
dice2 = (int) (Math.random() * 6) + 1;
img1 = new ImageIcon(dice1 + ".png");
img2 = new ImageIcon(dice2 + ".png");
try
{
Thread.sleep(150);
}
catch(Exception e)
{
}
lbl1.setIcon(img1);
lbl2.setIcon(img2);
}
}
试试这个我发现 here。
new Thread(new Runnable
{
public void run()
{
for(int count = 0; count < PREROLLS; count++)
{
//Add your for loop logic here!
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
//then update you icon here. I would start with one die if I were you.
imgDice1 = new ImageIcon(path + dice1 + ".png");
}
});
try { Thread.sleep(100); } catch(Exception e) {}
}
}
}).start();