1

我在 JApplet 中显示了一个图像(球),现在我希望图像以垂直方式(上下)移动。问题是我不知道该怎么做。

有人可以对此事有所了解吗?

4

4 回答 4

3

您需要将该图像的位置设置为某个计算值(意味着您使用时间、速度和其他限制来计算垂直位置)。

您如何设置该位置取决于您如何绘制图像。

示例,基于小程序(或嵌套组件)paint(Graphics g)方法中的绘图:

//first calculate the y-position
int yPos += timeSinceLastPaint * speed; //increment the position
if( (speed > 0 && yPos > someMaxY) || (speed < 0 && yPos <0 ) ) {
  speed *= -1; //if the position has reached the bottom (max y) or the top invert the direction  
}


//in your paint(Graphics g) method:
g.drawImage(image, yPos, x, null);

然后你必须不断地重新绘制小程序。

可以在此处找到有关小程序中动画的更多信息:http: //download.oracle.com/javase/tutorial/uiswing/components/applet.html

于 2011-09-16T11:21:46.417 回答
3

如何在 JApplet 中移动图像 ..?

几乎与您在JFrame, JComponentor JPanelor... 中执行此操作的方式完全相同

或者换一种说法,与小程序无关与. 有关更多详细信息,请参阅 Java 教程的2D 图形跟踪Graphics2D

当您知道如何移动图像并将其绘制到 a时,请在 a or的方法Graphics2D中实现该逻辑,并将带有移动图像的组件放入 a or (或 a等)。JComponentJPanelpaintComponent(Graphics)JAppletJFrameJPanel


对于它的动画方面,使用javax.swing.Timer如本例中所示的 a 。此示例不扩展任何组件。相反,它创建 aBufferedImage并将其添加到JLabel显示给用户的 a 中。当计时器触发时,代码会抓取Graphics图像的对象,然后从那里继续绘制弹跳线。

100 条弹跳线

import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.*;
import java.util.Random;

class LineAnimator {

    public static void main(String[] args) {
        final int w = 640;
        final int h = 480;
        final RenderingHints hints = new RenderingHints(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON
            );
        hints.put(
            RenderingHints.KEY_ALPHA_INTERPOLATION,
            RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY
            );
        final BufferedImage bi = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);
        final JLabel l = new JLabel(new ImageIcon(bi));
        final BouncingLine[] lines = new BouncingLine[100];
        int factor = 1;
        for (int ii=0; ii<lines.length; ii++) {
            lines[ii] = new BouncingLine(w*factor,h*factor);
        }
        final Font font = new Font("Arial", Font.BOLD, 30);
        ActionListener al = new ActionListener() {

            int count = 0;
            long lastTime;
            String fps = "";
            private final BasicStroke stroke = new BasicStroke(6);

            public void actionPerformed(ActionEvent ae) {
                count++;
                Graphics2D g = bi.createGraphics();
                g.setRenderingHints(hints);
                g.setColor(new Color(55,12,59));
                g.fillRect(0,0,w,h);
                g.setStroke(stroke);

                for (int ii=0; ii<lines.length; ii++) {
                    lines[ii].move();
                    lines[ii].paint(g);
                }

                if ( System.currentTimeMillis()-lastTime>1000 ) {
                    lastTime = System.currentTimeMillis();
                    fps = count + " FPS";
                    count = 0;
                }
                g.setColor(Color.YELLOW);
                g.setFont(font);
                g.drawString(fps,5,h-5);

                l.repaint();
                g.dispose();
            }
        };
        Timer timer = new Timer(25,al);
        timer.start();

        JOptionPane.showMessageDialog(null, l);
        //System.exit(0);
        timer.stop();
    }
}

class BouncingLine {
    private final Color color;
    private static final Random random = new Random();
    Line2D line;
    int w;
    int h;
    int x1;
    int y1;
    int x2;
    int y2;

    BouncingLine(int w, int h) {
        line = new Line2D.Double(random.nextInt(w),random.nextInt(h),random.nextInt(w),random.nextInt(h));
        this.w = w;
        this.h = h;
        this.color = new Color(
            random.nextInt(255)
            ,random.nextInt(255)
            ,random.nextInt(255)
            ,64+random.nextInt(128)
            );
        x1 = (random.nextBoolean() ? 1 : -1);
        y1 = (random.nextBoolean() ? 1 : -1);
        x2 = -x1;
        y2 = -y1;
    }

    public void move() {
        int tx1 = 0;
        if (line.getX1()+x1>0 && line.getX1()+x1<w) {
            tx1 = (int)line.getX1()+x1;
        } else {
            x1 = -x1;
            tx1 = (int)line.getX1()+x1;
        }
        int ty1 = 0;
        if (line.getY1()+y1>0 && line.getY1()+y1<h) {
            ty1 = (int)line.getY1()+y1;
        } else {
            y1 = -y1;
            ty1 = (int)line.getY1()+y1;
        }
        int tx2 = 0;
        if (line.getX2()+x2>0 && line.getX2()+x2<w) {
            tx2 = (int)line.getX2()+x2;
        } else {
            x2 = -x2;
            tx2 = (int)line.getX2()+x2;
        }
        int ty2 = 0;
        if (line.getY2()+y2>0 && line.getY2()+y2<h) {
            ty2 = (int)line.getY2()+y2;
        } else {
            y2 = -y2;
            ty2 = (int)line.getY2()+y2;
        }
        line.setLine(tx1,ty1,tx2,ty2);
    }

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(color);
        //line.set
        g2.draw(line);
    }
}

更新 1

我想在 JApplet(1) 中使用图像 (2) 进行操作,是否可能 (3)?

  1. mKorbel 和我自己的示例以 a 中的图像JLabelJPanel. 在我们的例子中,我们将组件添加到 a JOptionPane& a JFrame。任何一个示例都可以很容易地添加到 aJApplet或 aJDialog中,或者作为另一个面板的一部分,或者.. 有关更多详细信息,请参阅 Java 教程中的在容器内布局组件课程和使用顶级容器
  2. 而不是我们示例中的星星或线条,..绘制您的图像。我的示例甚至演示了如何让位置在容器范围内反弹。
  3. 当然可以,但“不包括电池”。我们的目的是为您提供一些想法,然后您可以适应您的弹跳球小程序。我怀疑有人会在小程序中使用球为您创建一个示例。虽然如果您发布一个显示您的意图和您尝试过的SSCCE ,我(和其他人)通常会使用该来源运行。如果您想要更具体的答案,请询问更具体的 SSCCE。;)
于 2011-09-16T11:43:01.833 回答
3

javax.swing.Timer的另一个示例,带有由创建的移动 Ojbects paintComponent(Graphics g),我有很多 Start,而不是一些模糊的 Mikado :-)

在此处输入图像描述

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;

public class AnimationBackground {

    private Random random = new Random();
    private JFrame frame = new JFrame("Animation Background");
    private final MyJPanel panel = new MyJPanel();
    private JLabel label = new JLabel("This is a Starry background.", JLabel.CENTER);
    private JPanel stopPanel = new JPanel();
    private JPanel startPanel = new JPanel();

    public AnimationBackground() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        panel.setBackground(Color.BLACK);
        for (int i = 0; i < 50; i++) {
            Star star = new Star(new Point(random.nextInt(490), random.nextInt(490)));
            star.setColor(new Color(100 + random.nextInt(155), 100 + random.nextInt(155), 100 + random.nextInt(155)));
            star.setxIncr(-3 + random.nextInt(7));
            star.setyIncr(-3 + random.nextInt(7));
            panel.add(star);
        }
        panel.setLayout(new GridLayout(10, 1));
        label.setForeground(Color.WHITE);
        panel.add(label);
        stopPanel.setOpaque(false);
        stopPanel.add(new JButton(new AbstractAction("Stop this madness!!") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                panel.stopAnimation();
            }
        }));
        panel.add(stopPanel);
        startPanel.setOpaque(false);
        startPanel.add(new JButton(new AbstractAction("Start moving...") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                panel.startAnimation();
            }
        }));
        panel.add(startPanel);
        frame.add(panel);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                AnimationBackground aBg = new AnimationBackground();
            }
        });
    }

    private class Star extends Polygon {

        private static final long serialVersionUID = 1L;
        private Point location = null;
        private Color color = Color.YELLOW;
        private int xIncr, yIncr;
        static final int WIDTH = 500, HEIGHT = 500;

        Star(Point location) {
            int x = location.x;
            int y = location.y;
            this.location = location;
            this.addPoint(x, y + 8);
            this.addPoint(x + 8, y + 8);
            this.addPoint(x + 11, y);
            this.addPoint(x + 14, y + 8);
            this.addPoint(x + 22, y + 8);
            this.addPoint(x + 17, y + 12);
            this.addPoint(x + 21, y + 20);
            this.addPoint(x + 11, y + 14);
            this.addPoint(x + 3, y + 20);
            this.addPoint(x + 6, y + 12);
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public void move() {
            if (location.x < 0 || location.x > WIDTH) {
                xIncr = -xIncr;
            }
            if (location.y < 0 || location.y > WIDTH) {
                yIncr = -yIncr;
            }
            translate(xIncr, yIncr);
            location.setLocation(location.x + xIncr, location.y + yIncr);
        }

        public void setxIncr(int xIncr) {
            this.xIncr = xIncr;
        }

        public void setyIncr(int yIncr) {
            this.yIncr = yIncr;
        }

        public Color getColor() {
            return color;
        }
    }

    private class MyJPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        private ArrayList<Star> stars = new ArrayList<Star>();
        private Timer timer = new Timer(20, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                for (Star star : stars) {
                    star.move();
                }
                repaint();
            }
        });

        public void stopAnimation() {
            if (timer.isRunning()) {
                timer.stop();
            }
        }

        public void startAnimation() {
            if (!timer.isRunning()) {
                timer.start();
            }
        }

        @Override
        public void addNotify() {
            super.addNotify();
            timer.start();
        }

        @Override
        public void removeNotify() {
            super.removeNotify();
            timer.stop();
        }

        MyJPanel() {
            this.setPreferredSize(new Dimension(512, 512));
        }

        public void add(Star star) {
            stars.add(star);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            for (Star star : stars) {
                g.setColor(star.getColor());
                g.fillPolygon(star);
            }
        }
    }
}
于 2011-09-16T12:55:16.100 回答
3

我想在JApplet.

为什么不兼得?您可以拥有一个混合应用程序/小程序,如本动画所示。

于 2011-09-16T14:46:24.843 回答