【问题标题】:How to stop moving image in a JApplet from flickering如何阻止 JApplet 中的移动图像闪烁
【发布时间】:2013-06-07 21:11:59
【问题描述】:

我 3 年来第一次成功地创建了一个(基本的)动画 JApplet,但我对它移动时闪烁的图像感到恼火。 Timer 对象使图像移动,而我的私有内部类“TimerListener”负责移动图像的动画运动。

下面是我的TimerListener类的代码,我觉得这个问题或许可以解决:

@Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(smileyFace.getImage(), xCoord, yCoord, this);
    }

    private class TimerListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            //Following if-else manipulates Y coordinate
            if (goingUp) {
                if (yCoord > minY) {
                    yCoord -= move;
                } 
                else {
                    goingUp = false;
                }
            } else {
                if (yCoord < (getContentPane().getHeight() - (smileyFace.getIconHeight()+ Y_OFFSET))) {
                    yCoord += move;
                } 
                else {
                    goingUp = true;
                }
            }

            //Following if-else manipulates X coordinate
            if (goingSideways) {
                if (xCoord > 0) {
                    xCoord -= move;
                } 
                else {
                    goingSideways = false;
                }
            } else {
                if (xCoord < (getContentPane().getWidth() - (smileyFace.getIconWidth() + X_OFFSET))) {
                    xCoord += move;
                } 
                else {
                    goingSideways = true;
                }
            }

            repaint();
        }
    }

如果有帮助,这是我的 JApplet 的屏幕截图 - 在这种情况下,巨魔的脸应该在黑色区域中移动,并在碰到它们时从侧面反弹:

对于那些想要运行和测试 JApplet 的人,可以从 https://github.com/rattfieldnz/Java_Projects/tree/master/JAppletAnimation 获取 Netbeans 项目。

【问题讨论】:

  • stackoverflow.com/questions/7004866/… 问题是你正在重新绘制整个小程序。
  • @arynaq 谢谢你,它工作得很好:)。现在将结束此问题,并将答案“归功于”您。
  • 为什么要编写小程序?如果是由于规范。老师请转至Why CS teachers should stop teaching Java applets
  • @AndrewThompson 我的教授要求我创建一个小程序...我还没有真正被告知为什么不应再使用小程序。我想创建这个小程序的目的是让我记住它们是如何制作的。我可以很容易地把它变成一个独立的 Java 应用程序。
  • @AndrewThompson 如果您想在浏览器中制作类似小程序的应用程序,您会推荐使用什么?我知道 HTML5、CSS3 和 Javascript 的组合在这里可以很好地工作..

标签: java applet japplet


【解决方案1】:

感谢用户 'arynaq',我已经解决了我的问题。我把下面的paint方法:

@Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(smileyFace.getImage(), xCoord, yCoord, this);
    }

...进入一个扩展 JPanel 的内部类(注意我如何将 'paint' 更改为 'paintComponent'):

class ImagePanel extends JPanel
    {

        public ImagePanel()
        {
            setBackground(Color.BLACK);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(smileyFace.getImage(), xCoord, yCoord, this);
        }

        @Override
        public void setBackground(Color bg) {
            super.setBackground(bg); //To change body of generated methods, choose Tools | Templates.
        }


    }

...然后通过它的 init() 方法将它添加到我的 JApplet 中(我不确定通过调用 JApplet 的构造函数是否正确...):

@Override
public void init() {

    smileyFace = new ImageIcon("images/happyFace.png");
    **add(new ImagePanel());**
    timerDelay = 10;
    timer = new Timer(timerDelay, new TimerListener());
    timer.start();

    //getContentPane().setBounds(0, 0, CONTENTPANE_WIDTH, CONTENTPANE_HEIGHT);
    getContentPane().setBackground(Color.BLACK);

    //maxY = getContentPane().getHeight();
    minY = 0;

    xCoord = 0;
    yCoord = 0;
    move = 2;

}

您可以通过克隆 my GitHub JApplet project 并在 NetBeans 中运行它来查看它的运行情况:)。

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多