在这个弹跳球动画的简单代码示例中:
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机器,两者都会绘制球和背景(经过漫长的等待),但不会继续动画。
在这里是否存在某种特定于平台的代码? 谢谢!
答案 0 :(得分:3)
paint()
方法,它应该尽可能快地返回。
那么你将把动画代码放在哪里?答案很简单:你需要把代码放到一个单独的线程中。
对于Windows和OS X之间的区别,我只能说它应该与他们如何安排线程或类似的东西有关。
答案 1 :(得分:2)
永远不要在任何阻止或可能触发重绘请求的paint
方法中执行任何操作。
你应该总是打电话给super.paintXxx
,这些方法在后台做了很多工作,通常情况要好得多。
您不需要(极少数情况下)从顶级容器扩展,例如JApplet
或JFrame
。您最好创建自定义容器(例如JPanel
)并将组件添加到其中(或执行自定义绘图)。除了双缓冲支持外,您还可以灵活选择部署。
不要自欺欺人,你不要控制油漆过程,由重漆经理做出决定,但你可以“鼓励”更新。当人们开始玩动画时,这会造成最大的痛苦。
您应该在事件调度线程(EDT)的影响之外修改动画的“状态”,或者在paint
上下文之外修改动画的“状态”。
你的问题很简单,一个简单的javax.swing.Timer
就可以解决它。更复杂的动画可能需要“动画”线程。
public class GraphicsMovement extends JApplet {
@Override
public void init() {
setLayout(new BorderLayout());
add(new AnimatedPane());
}
@Override
public void start() {
}
public class AnimatedPane extends JPanel {
private Timer timer;
private boolean colorSwitch = false;
private int yOffset = 0;
private int direction = 1;
public AnimatedPane() {
timer = new Timer(10, new ActionListener() {
public void actionPerformed(ActionEvent e) {
// colorSwitch = !colorSwitch;
yOffset += direction;
if (yOffset > 100) {
direction = -1;
yOffset = 100;
} else if (yOffset < 0){
direction = 1;
yOffset = 0;
}
repaint();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
setBackground(new Color(140, 214, 225));
}
@Override
protected void paintComponent(Graphics page) {
super.paintComponent(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.
if (colorSwitch) {
page.setColor(new Color(140, 214, 225));
} else {
page.setColor(Color.YELLOW);
}
page.fillOval(100, 55 + yOffset, 100, 100); //draws a yellow oval
}
}
}
我关注的是10毫秒的“延迟”,这足以让我面对健康:P
你可能会发现阅读...
有些兴趣