【发布时间】:2014-03-03 05:54:15
【问题描述】:
在这个弹跳球动画的简单代码示例中:
import javax.swing.JApplet;
import javax.swing.JFrame;
import java.awt.*;
public class GraphicsMovement extends JApplet
{
public static void pause()
{
try {
Thread.sleep(10);
} catch(InterruptedException e) {
}
}
public static void main(String args[])
{
JApplet example = new GraphicsMovement();
JFrame frame = new JFrame("Movement");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(example);
frame.setSize(new Dimension(500,300)); //Sets the dimensions of panel to appear when run
frame.setVisible(true);
}
public void paint (Graphics page)
{
int width = getWidth(); // width = the width of the panel which appears when run
int height = getHeight(); // height = the height of the panel which appears when run.
//Changes background color to a blueish color
page.setColor(new Color (140,214,225));
page.fillRect(0,0,width,height);
for(int i = 0; i <= 5; i++)
{
for (int j = 0; j <= 100; j++)
{
page.setColor(Color.YELLOW);
page.fillOval(100,55 + j,100,100); //draws a yellow oval
pause();
page.setColor(new Color (140,214,225));
page.fillOval(100,55 + j,100,100); //draws a blueish oval over the yellow oval
}
for (int k = 100; k >= 0; k--)
{
page.setColor(Color.YELLOW);
page.fillOval(100,55 + k,100,100); //draws a yellow oval
pause();
if (k != 0)
{
page.setColor(new Color (140,214,225)); //draws a blueish oval over the yellow oval
page.fillOval(100,55 + k,100,100);
}
}
}
}
}
动画画得很好,可以在 Windows 机器上运行(使用 JCreator),但不能在用 IntelliJ 或 Eclipse 编译的 Mac OS X 上运行。在两台不同的 OS X 机器上尝试过,两者都将绘制球和背景(经过长时间的等待),但不会继续动画。
这里是否有一些我缺少的特定于平台的代码? 谢谢!
【问题讨论】:
-
不要在 EDT 上睡觉; 做见Concurrency in Swing,尤其是Initial Threads..
-
对不起,我还是 java 新手……这是因为惯例还是 EDT 正在休眠导致这些特殊问题的事实?我阅读了链接,但我不确定为什么线程在这个特定示例中很重要。
-
@kmypwn :您不需要
Thread.sleep(),而是需要使用javax.swing.Timer。这是一个很棒的example。线程与您的具体示例无关,线程与整个 Swing 有关,这就是@trashgod 提到的这两个链接的原因。 -
拜托,拜托,请调用 super.paint(g);,品脱方法 o 很多重要的后台工作,你永远不应该忽视
标签: java macos swing animation paint